C++23 是否允许在不同的翻译单元中对命名空间范围的非内联变量进行多个定义?

问题描述 投票:0回答:1

在旧版本的 C++ 中,例如 C++17,单一定义规则在较高级别上很直观,因为它只允许变量的一个定义。 例如:

每个程序都应包含在该程序中在废弃语句之外使用的每个非内联函数或变量的精确定义;

我在C++23标准中找不到任何类似的限制。 这个禁令解除了吗? [basic.def.ord] 第 14 段包含以下限制:“对于在多个翻译单元中定义的任何可定义项 D,如果 D 是非内联非模板化函数或变量……”本质上,定义必须是相同的。 但这似乎意味着确实可以有这样的程序:

// a.cc
int a = 1;

// b.cc
int a = 1;

对于非内联变量,ODR 规则确实大幅放宽了吗? 如果是这样,为什么? 如果不是,禁止这种多重定义的新规范语言是什么?

c++ language-lawyer c++23 one-definition-rule
1个回答
0
投票

这是来自 [basic.def.odr] (C++23) 的更完整引用

对于任何具有多个翻译单元定义的可定义项 D,

  • 如果 D 是非内联非模板化函数或变量,或者
  • 如果不同翻译单位的定义不满足以下要求,

程序格式错误;

这条规则没有改变。

对于多个翻译单元中的任何定义:

  • 第一个要点是告诉您非内联非模板化定义是 ODR 违规

这会使您的代码示例违反 ODR。

  • 第二个要点是告诉您,内联或模板化定义仍然可能违反 ODR,例如,如果它们不是相同的代码。
© www.soinside.com 2019 - 2024. All rights reserved.