[英]Reinterpret cast a template non-type parameter: clang c++14 vs c++1z
考虑以下代码:
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是否有与此处相关的更改?
使用godbolt演示在-std=c++1z
模式下,Clang 3.5.1接受代码,但3.6.0拒绝代码。 更改日志指示此版本是在添加对C ++ 1z功能的支持时进行的,即“对所有非类型模板参数的恒定评估”。 我的猜测是C ++ 11和C ++ 14模式使用C ++ 11规则,而C ++ 1z模式使用C ++ 1z /最新草案规则。 当然,该程序在C ++ 11/14模式下被视为有效的事实本身就是一个错误。
以下是一些类似(但不直接相关)的错误报告:
错误18043-允许将任意地址常量表达式作为非类型模板参数作为扩展
错误10398-Clang不会接受空指针常量作为非类型模板参数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.