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?
Trả lời
Vì 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).
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.
'#include
@MarcGlisse Hãy thử thêm' constexpr' vào trước 'a' và' X', và nó sẽ không biên dịch! – TemplateRex
'#include
- 1. Khởi tạo một mảng với một constexpr?
- 2. thể std :: vector được đối xử như một mảng
- 3. Lỗi sử dụng một constexpr làm mẫu tham số trong cùng lớp
- 4. Là "std :: cout" có thể sử dụng trong Android-ndk
- 5. Có một cú pháp cụ thể để khởi tạo một mảng std :: từ một mảng khác, std :: khác nhau không?
- 6. Trong C++ 11 là sqrt được định nghĩa là constexpr?
- 7. Tôi có nên sử dụng constexpr như thế này không?
- 8. Lookup bảng với constexpr
- 9. Có thể DBIx :: Lớp được sử dụng để tạo bảng?
- 10. Sử dụng std :: mảng với khởi liệt kê
- 11. Có thể đăng nhập nếu một lớp trong JVM được sử dụng không?
- 12. Có cách nào để tạo một lớp tùy chỉnh có thể có [] được sử dụng trong Java, tương tự như một mảng không?
- 13. Tôi có thể sử dụng std :: valarray để lưu trữ/thao tác một mảng 2D liền kề như thế nào?
- 14. một mảng java có thể được sử dụng như một HashMap chính
- 15. Sử dụng một std :: unordered_set của std :: unique_ptr
- 16. Có thể std :: chức năng được serialized?
- 17. Sử dụng một trình phân bổ tùy chỉnh bên trong một std :: scoped_allocator_adaptor với std :: unordered_map
- 18. Số lượng mảng không sử dụng odr?
- 19. sử dụng set_new_handler lớp cụ thể
- 20. C++ 11 std :: mảng
- 21. Bạn có thể sử dụng `std :: remove_if` trên vùng chứa` std :: unique_ptr` không?
- 22. Khi nào các lớp học theo nghĩa đen nên được sử dụng trong C++?
- 23. Sử dụng std :: reference_wrapper làm khóa trong std :: map
- 24. Chọn lớp constructor sử dụng enable_if
- 25. Tôi có thể sử dụng một đối tượng được khởi tạo làm Khóa Mảng không?
- 26. std :: tìm trên một mảng kế thừa
- 27. Có thể std :: async được sử dụng với chức năng mẫu
- 28. Gán nhiều giá trị để std :: mảng trong std :: map
- 29. Tạo một lớp học có thể sử dụng được cho các chương trình khác
- 30. Cách sử dụng std :: shared_ptr
'std :: array' không có hàm tạo' constexpr' theo kiến thức tốt nhất của tôi –
'std :: array' không có hàm tạo (do người dùng xác định). Đó là tổng hợp. – chris
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. –