2013-01-10 15 views
25

Tôi hiện đang tạo một lớp với một hàm tạo constexpr và tôi tự hỏi liệu tôi có thể sử dụng một số std::array để lưu trữ dữ liệu của lớp này hay không. Liệu tiêu chuẩn có chỉ định rõ ràng rằng một số std::array có một hàm tạo constexpr và nội dung của nó có thể được truy cập tại thời gian biên dịch không?Có thể std :: mảng được sử dụng trong một lớp constexpr?

+0

'std :: array' không có hàm tạo' constexpr' theo kiến ​​thức tốt nhất của tôi –

+10

'std :: array' không có hàm tạo (do người dùng xác định). Đó là tổng hợp. – chris

+1

Lưu ý rằng mặc dù bạn có thể lưu trữ dữ liệu, bạn sẽ gặp khó khăn hơn trong việc trích xuất dữ liệu theo cách constexpr. –

Trả lời

21

std::array<T, N> là một tổng hợp, nó có thể được khởi tạo như một constexpr khi và chỉ khi loại cơ bản T có một constructor constexpr (khi trình bày với mỗi initializer bạn cung cấp).

7

Dựa trên những nhận xét của @MarkGlisse: đây compiles

#include <array> 
#include <iostream> 

template<typename T, std::size_t N> 
struct X 
{ 
    constexpr X(const std::array<T,N>& a):arr(a){} 

    private: 
    std::array<T,N> arr; 
}; 

constexpr std::array<int,2> a {{ 13, 18 }}; 
constexpr X<int,2> x = a; 

int main() 
{   
} 

Tôi tin rằng tôi đã tìm thấy các trích dẫn có liên quan từ tiêu chuẩn ở đây:

12,1 Constructors [class.ctor]

6 Một hàm tạo mặc định được mặc định và không được định nghĩa là đã xóa là được xác định rõ ràng khi nó là od rused (3.2) để tạo ra một đối tượng của loại lớp (1.8) hoặc khi nó được mặc định rõ ràng sau tuyên bố đầu tiên của nó . Hàm khởi tạo mặc định ngầm định thực hiện tập hợp các khởi tạo của lớp sẽ được thực hiện bởi một hàm tạo mặc định được viết bởi cho lớp đó không có ctor-initializer (12.6.2) và một câu lệnh rỗng. Nếu điều đó hàm tạo mặc định do người dùng viết sẽ bị hỏng, chương trình là không đúng định dạng. Nếu hàm tạo mặc định được viết bởi người dùng đó sẽ đáp ứng các yêu cầu của một hàm tạo constexpr (7.1.5), thì hàm tạo mặc định mặc định là constexpr.

Điều này trông giống như câu trả lời của @ BenVoigt.

+0

'#include #include template struct X { constexpr X (std :: mảng & a): arr (a) {} tin: std: : mảng arr; }; std :: mảng a = {13, 18}; X x = a; 'biên dịch cho tôi ... –

+0

@MarcGlisse Hãy thử thêm' constexpr' vào trước 'a' và' X', và nó sẽ không biên dịch! – TemplateRex

+0

'#include #include template struct X { constexpr X (const std :: mảng & a): arr (a) {} tin: std :: mảng arr; }; constexpr std :: mảng a = {13, 18}; constexpr X x = a; ' biên dịch tốt. –

Các vấn đề liên quan