constexpr int get() { return 5; }
template<int N> struct Test {};
int main()
{
int a[get()]; // ok
Test< get() > obj; // error:'int get()' cannot appear in a constant-expression
}
Tôi có compiled this code with ideone. Và đã tự hỏi rằng tại sao nó cho lỗi biên dịch. Chức năng constexpr
không được phép là đối số template
hoặc đó là lỗi trong trình biên dịch?Có hợp lệ để sử dụng hàm constexpr làm đối số mẫu không?
Sửa: thay đổi const int get()
-int get()
Hơn nữa, có thêm một lỗi với ideone là, nếu bạn loại bỏ constexpr
sau đó still declaring an array is allowed !! Tôi nghĩ đó là một tính năng của C99.
Chỉnh sửa của bạn không chính xác, bạn đã tạo nó thành 'constexpr const get()'. – GManNickG
@GMan, cảm ơn ... – iammilind
Trên chỉnh sửa, đó là một tính năng C99 và gcc có nó như là một phần mở rộng, nhưng nó không phải là C++ thích hợp, và nó sẽ không được di động. Nó được xem xét để đưa vào tiêu chuẩn và bị từ chối vì nó sẽ phá vỡ bất biến mà các loại (kích thước là một phần của loại) phải được biết tại thời gian biên dịch. Trong C nó không quan trọng nhiều, nhưng trong C + + bạn sẽ không thể sử dụng mảng đó như là một đối số kiểu cho một mẫu (chính xác loại không biết tại thời gian biên dịch) - đó là bằng cách hành vi trong gcc, nó sẽ phàn nàn nếu bạn cố gắng làm điều đó. –