2015-10-20 16 views
6

tôi có thể tạo constexpr std :: mảng:Không thể tạo std :: vector constexpr

constexpr std::array<int,5> values {1,2,3,4,5}; 

Nó hoạt động tốt. Nhưng tôi không thể tạo constexpr vector:

constexpr std::vector<int> vec = {1,2,3,4,5}; 

Nó mang lại cho tôi một lỗi:

the type 'const std::vector<int>' of constexpr variable 'vec' is not literal constexpr std::vector<int> vec = {1,2,3,4,5};

+9

Chính thức, đó là do hàm tạo 'vector' không được khai báo' constexpr'. Tại sao nó không được tuyên bố như vậy? Bởi vì constructor 'vector' thường cần phân bổ bộ nhớ trên heap, tất nhiên chỉ có thể được thực hiện trong thời gian chạy. –

+0

@Igor Tandetnik như vậy, không có cách nào để tạo ra vector constexpr? – Leo

+3

Không có. Tại sao bạn sẽ muốn? Nó có ý nghĩa với tôi. Toàn bộ điểm của 'vector' là khả năng thay đổi kích thước động. Nếu bạn không cần điều đó, chỉ cần sử dụng 'std :: array' hoặc plain array. –

Trả lời

9

AFAIK Các initlializer_list constructor của std::vector<> không được khai báo constexpr.

9

std::vector sử dụng phân bổ bộ nhớ động. Không thể sử dụng toán tử new trong các phương thức constexpr, do đó std::vector sẽ không bao giờ là constexpr, hàm tạo của hàm constexpr không thể khai báo được. std::array không sử dụng phân bổ bộ nhớ động, nó được cấp phát trong ngăn xếp. Nó không có bất kỳ vấn đề với các quy tắc của việc tạo ra các đối tượng constexpr và có thể được constexpr.

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