extern int constexpr i = 42; //-6ren">
gpt4 book ai didi

c++ - gcc 中变量模板的错误显式模板特化

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:48 24 4
gpt4 key购买 nike

//i.h

template<int> extern int const i;

//i.cpp

#include "i.h"
template<> extern int constexpr i<0> = 42;

// main.cpp

#include "i.h"
int main()
{
return i<0>;
}

在 C++14/17 模式下,这会用 clang 返回 42,但是 gcc 会出错:“显式模板特化不能有存储类”。

这是 gcc 中的错误吗?

最佳答案

整个问题有一个相当简单的解决方案。请另外查看 this在 ISO C++ 标准 - 讨论论坛上发帖以及 Richard Smith 的回复。

1.extern 不得在显式特化中指定

所以回答原来的问题:不是,不是gcc的bug,报错是正确的(Massimiliano Janes已经回答过了)

相比之下,clang 实际上在这里有一个错误(正如 Massimiliano Janes 已经猜到的那样)因为 extern 被接受了。也许 clang 会默默地接受它,因为它与主模板的相同。

2。理论上(根据标准)解决方案是删除 extern 因为模板链接是按名称进行的,因此特化“继承”了主模板的链接(再次参见 Massimiliano Janes 的回答)

但在实践中它不起作用,因为这里的两个编译器都不正确,并且显式特化错误地具有内部链接而不是外部主模板的链接。

3。总结:

gcc 从不编译在 (1) 中正确但在 (2) 中不正确的。clang 在 (1) 中编译,这是不正确的,但在 (2) 中不编译,这也是不正确的。

我将为 clang 提交错误报告。如果有人感兴趣,请随时为 gcc 提交错误。我不会这样做,因为(不幸的是)我不能在我的开发环境 Visual Studio 中使用 gcc。

关于c++ - gcc 中变量模板的错误显式模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46752714/

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