2011-06-15 52 views
10
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.

+0

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

+0

@GMan, cảm ơn ... – iammilind

+3

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 đó. –

Trả lời

13

GCC 4.5 (ít nhất là phiên bản được sử dụng tại Ideone) không hoàn toàn hỗ trợ constexpr, bao gồm việc sử dụng hợp lệ của bạn; nó rơi xuống một số const. GCC 4.6 và hỗ trợ chính xác nó.

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