Trong một cuộc thảo luận về câu hỏi khác, tôi đã được đưa ra một ví dụ nơi dường như mối liên hệ của một định ảnh hưởng khả năng sử dụng của nó trong một biểu thức hằng:Tại sao các biến liên kết bên ngoài có thể sử dụng dưới dạng biểu thức không đổi?
extern char const a[] = "Alpha";
char constexpr b[] = "Beta";
char const g[] = "Gamma";
template <const char *> void foo() {}
auto main()
-> int
{
foo<a>(); // Compiles
foo<b>(); // Compiles
foo<g>(); // Doesn't compile
}
Các lỗi từ cuối cùng (với GCC) là:
test.cc: In function 'int main()':
test.cc:12:13: error: the value of 'g' is not usable in a constant expression
foo<g>(); // Doesn't compile
^
test.cc:3:16: note: 'g' was not declared 'constexpr'
char const g[] = "Gamma";
^
Tôi có thể đã bỏ lỡ tầm quan trọng của ví dụ trong cuộc thảo luận trước đó, bởi vì tôi tin rằng nó không thể chỉ là mối liên kết khác biệt foo<a>
từ foo<g>
- tuy nhiên, tôi đã bắt đầu nghi ngờ vị trí đó.
- Đây có phải là liên kết hay một số thuộc tính khác được cấp bởi
extern
, cho phépfoo<a>()
? - Lý do cho phép
foo<a>()
nhưng không phải làfoo<g>()
là gì? Cụ thể, nếu nó được xác định bởi liên kết, tại sao liên kết bên trong sẽ làm cho biến không thể sử dụng được dưới dạng biểu thức liên tục khi cùng một biến được khai báoextern
sẽ có thể sử dụng được không? - Người ta cho rằng câu hỏi của biểu tượng đang hiển thị (hoặc không) đối với mối liên kết có liên quan ở đây. Với tôi, có vẻ như thực tế biến thể
foo<b>
vẫn được cho phép ngay cả khistatic
được thêm vào sẽ loại bỏ điều này - hoặc tôi có nhầm lẫn không? - (Sự khác biệt giữa
foo<b>()
vàfoo<g>()
được bao phủ đầy đủ bởi other questions, tôi nghĩ).
Clang vui vẻ chấp nhận cả ba. –
@ T.C. nó cũng vậy ... chết tiệt. Bất kỳ ý tưởng mà trình biên dịch là chính xác? – davmac
GCC 6 cũng chấp nhận với '-std = C++ 1z'. –