我偶然發現了我不明白的代碼。下面是它的一個簡化版本:C++ 98大括號const標量初始化
template <int> struct A {};
int const i = { 42 };
typedef A<i> Ai;
int const j = 42;
typedef A<j> Aj;
此代碼在C++ 98模式下編譯爲GCC,但不在Clang中編譯。鏘產生以下錯誤:
$ clang -Wall -Wextra -std=c++98 -c test.cpp
test.cpp:4:11: error: non-type template argument of type 'int' is not an integral constant expression
typedef A<i> Ai;
^
test.cpp:4:11: note: initializer of 'i' is not a constant expression
test.cpp:3:11: note: declared here
int const i = { 42 };
^
據我瞭解有和沒有大括號應該是相當於int
初始化。 Clang將i
初始化爲42
,但並不認爲這是編譯時間常量。
此代碼在C++ 11模式下編譯良好。
是否有原因j
被視爲編譯時間常量,i
是不是?或者它僅僅是Clang中的一個錯誤?
更新:我在LLVM bug跟蹤器中打開了一個ticket這個問題。
我會說這是在編譯器中的錯誤。 – Raxvan
@Raxvan:這是一個非常大膽的陳述......考慮到它在C++ 11中工作,而不是在C++ 98中,它似乎是非常慎重的,所以我實際上期望它是*按規格*(在Clang部分) ,並且gcc像往常一樣更寬鬆。 –
@MatthieuM .:我認爲這是他想說的:它是一個gcc中的bug。沒有C++ 98的語法,clang正確地拒絕它。所以接受它在gcc中,儘管不是C++ 98,是一個錯誤。 – PlasmaHH