下面的代码在gcc10和更高版本中会失败,但在gcc7到gcc9中传递。
我想知道为什么?有人能帮我吗?
你可以试试这里:https://godbolt.org/(在右侧面板中切换编译器版本)
template <typename R>
inline constexpr bool foo = true;
template <typename R>
inline constexpr bool foo = false;
int main() {
return 0;
}
在gcc10及以上版本中,错误消息为:
<source>:5:23: error: redefinition of 'template<class R> constexpr const bool foo'
5 | inline constexpr bool foo = false;
| ^~~
<source>:3:23: note: 'template<class R> constexpr const bool foo<R>' previously declared here
3 | inline constexpr bool foo = true;
| ^~~
ASM generation compiler returned: 1
<source>:5:23: error: redefinition of 'template<class R> constexpr const bool foo'
5 | inline constexpr bool foo = false;
| ^~~
<source>:3:23: note: 'template<class R> constexpr const bool foo<R>' previously declared here
3 | inline constexpr bool foo = true;
| ^~~
Execution build compiler returned: 1
2条答案
按热度按时间8iwquhpp1#
我自己回答的。
这是gcc10中修复的一个bug。
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92576
wixjitnu2#
根据[basic.def.odr],该程序是格式错误的
来自[basic.def.odr]:
单定义规则
1.以下各项均称为可定义项:
任何翻译单元不得包含任何可定义项的一个以上定义。
由于变量模板是一个模板化的实体,翻译单元不能有多个定义。
这是一个旧的gcc bug,现已修复。