繁体   English   中英

重新解释强制转换模板非类型参数:clang c ++ 14 vs c ++ 1z

[英]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不会接受空指针常量作为非类型模板参数

错误10396-使用非类型模板参数进行名称修改时,clang崩溃

错误9700-空指针不被接受为非类型模板参数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM