【发布时间】:2016-09-15 06:13:04
【问题描述】:
考虑以下代码:
template <int* > struct foo { };
int main() {
foo<(int*)42> f;
(void)f;
}
当使用-std=c++11 或-std=c++14 在clang 3.8.0 上编译时,程序会编译。使用-std=c++1z 编译时,出现以下错误:
main.cpp:4:9: error: non-type template argument is not a constant expression
foo<(int*)42> f;
^~~~~~~~
无论 C++ 模式如何,gcc 5.3.0 都不会编译代码,我认为这是正确的。 C++14 和 C++1z 之间的 clang 有什么区别,为什么它接受代码?与此处相关的 C++1z 中是否发生了一些变化?
【问题讨论】:
-
附带说明,VS 2015 编译得很好
-
显然是一个错误。 C++1z 放松了对非类型模板参数的约束,因此可能使用了不同的代码路径(不会触发错误)。
-
它显然被视为空指针:coliru.stacked-crooked.com/a/966a61826b6d73f9。这不是理智的行为。
-
@T.C.,是什么让你认为这是可能的?
-
@Rakete1111 以什么方式编译上述代码最好描述为“很好”。