在關於另一個問題的討論,我給出一個例子,其中的標識符顯然聯動影響了其在一個常量表達式可用性:爲什麼外部連接變量可用作常量表達式?
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
}
從最後(具有GCC)是誤差:
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";
^
我可能在前面的討論中錯過了這個例子的意義,因爲我相信它不可能只是連接區別foo<a>
從foo<g>
- 但是,我已經開始懷疑這個位置。
- 難道真的聯動,或者是通過
extern
給予一些其他的屬性,允許foo<a>()
? - 什麼是允許
foo<a>()
但不foo<g>()
的理由?特別地,如果它是由連鎖確定,爲什麼要內部鏈接導致變量不被可用作常量表達式時相同的變量聲明extern
將是可用? - 有人建議符號的問題是可見的(或不)的連接器與此有關。對我來說,即使添加了
static
,foo<b>
變體仍然被允許,這一事實似乎反駁了這一點 - 或者我誤會了嗎? - (
foo<b>()
和foo<g>()
之間的差被充分地other questions覆蓋,我想)。
鏗鏘愉快地接受所有三個。 –
@ T.C。以及它所做的......該死的。任何想法哪個編譯器是正確的? – davmac
GCC 6也接受'-std = C++ 1z'。 –