gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:41:51 26 4
gpt4 key购买 nike

考虑以下代码:

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 拒绝它。 changelog表示此版本是在添加对 C++1z 功能的支持时添加的,即“对所有非类型模板参数的持续评估”。我的猜测是 C++11 和 C++14 模式使用 C++11 规则,而 C++1z 模式使用 C++1z/最新草案规则。当然,程序在 C++11/14 模式下被认为是有效的事实本身就是一个错误。

以下是一些具有类似(但不直接相关)案例的错误报告:

Bug 18043 - allow arbitrary address constant expressions as non-type template arguments as an extension

Bug 10398 - Clang won't accept a null pointer constant as a non-type template argument

Bug 10396 - clang crashes during name mangling with as non-type template parameter

Bug 9700 - Null pointer not accepted as non-type template argument

关于c++ - 重新解释强制转换模板非类型参数 : clang c++14 vs c++1z,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37305015/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com