2016-05-17 21 views
7

Các mã sauGọi phương thức constexpr thông qua tham chiếu - là kết quả của một biểu thức không đổi?

#include <array> 

void foo(const std::array<int, 42> &a) 
{ 
    constexpr size_t S = a.size(); 
} 

int main() {} 

biên dịch tốt trong GCC, nhưng thất bại trong việc biên dịch trong kêu vang với thông báo lỗi sau

main.cpp:5:28: error: constexpr variable 'S' must be initialized by a constant expression 
     constexpr size_t S = a.size(); 
          ^~~~~~~~ 

Trong khi đó, nhiều bài viết về constexpr vấn đề trên SO dường như ngụ ý kêu vang thường có hỗ trợ tốt hơn (nhiều người hơn?) cho constexpr. Vậy, trình biên dịch nào sẽ đúng trong trường hợp này?

Lưu ý rằng cả hai trình biên dịch sẵn sàng chấp nhận mã khi thông số tham chiếu được thay thế bằng thông số giá trị theo từng giá trị.

Trả lời

7

[expr.const]/2:

Một có điều kiện thể hiệne là một lõi liên tục biểu trừ việc thẩm định e, theo các quy tắc của máy trừu tượng ([intro.execution]), sẽ đánh giá một trong các biểu thức sau:

  • [...]
  • một id-biểu đó đề cập đến một biến thành viên hoặc dữ liệu kiểu tham chiếu trừ trường hợp tài liệu tham khảo có một khởi trước và một trong hai

    • nó được khởi tạo với một biểu thức hằng hoặc
    • đời của nó bắt đầu trong vòng đánh giá của e;
  • [...]

Đánh giá a.size() đánh giá id-biểua, mà "đề cập đến một biến ... của loại tài liệu tham khảo" và không có người khởi tạo trước đó. Do đó, nó không phải là một biểu thức liên tục cốt lõi và do đó không phải là một biểu thức liên tục.

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