【发布时间】:2013-12-18 16:07:31
【问题描述】:
我偶然发现了我不理解的代码。这是它的简化版本:
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 产生以下错误:
$ 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 错误跟踪器中打开了一个 ticket 并解决了这个问题。
【问题讨论】:
-
我会说这是编译器中的错误。
-
@Raxvan:这是一个相当大胆的声明......考虑到它在 C++11 中而不是在 C++98 中有效,这似乎是经过深思熟虑的,所以我实际上希望它是 根据规范(在 Clang 部分),并且 gcc 像往常一样更加宽松。
-
@MatthieuM.:我认为这就是他想表达的:它是 gcc 中的一个错误。对此没有 C++98 语法,clang 理所当然地拒绝了它。因此,尽管不是 C++98,但在 gcc 中接受它是一个错误。
-
我现在正在检查 98 标准以查找所有数据。