gcc 10+中不允许重定义,但gcc 7 -9中允许重定义

a9wyjsp7  于 2023-05-18  发布在  其他
关注(0)|答案(2)|浏览(222)

下面的代码在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
8iwquhpp

8iwquhpp1#

我自己回答的。
这是gcc10中修复的一个bug。
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92576

wixjitnu

wixjitnu2#

根据[basic.def.odr],该程序是格式错误的
来自[basic.def.odr]:
单定义规则
1.以下各项均称为可定义项:

  • 模板化实体
    任何翻译单元不得包含任何可定义项的一个以上定义。

由于变量模板是一个模板化的实体,翻译单元不能有多个定义。
这是一个旧的gcc bug,现已修复。

相关问题