【发布时间】:2019-02-08 14:17:16
【问题描述】:
引用 C++ 草案 N4713:
每个程序都应该包含每个非内联的定义 函数或变量在该程序之外的 odr 中使用 废弃的声明(9.4.1);无需诊断。定义 可以在程序中显式出现,可以在标准中找到 或用户定义的库,或(在适当时)它是隐式的 定义(见 15.1、15.4 和 15.8)。内联函数或变量 应在使用 odr 的每个翻译单元中定义 在被丢弃的语句之外。
在 C++17 之前的 C++ 版本中,我可以通过声明我的函数 inline 来绕过这个限制。 C++17 为变量添加了相同的功能。
此外,在我看来,inline-关键字除了可以忽略 ODR 之外没有其他用途。
那么,为什么不为 C++17 放弃这条规则呢?我看不到可以关闭的规则的用途。
【问题讨论】:
-
因为如果它被放弃了,那么当您在符号中出现冲突时会发生什么?
-
@Ricardo 为什么要放弃它?
-
你为什么要“绕过”保护你的限制?
-
即使使用未来的模块,我们也可以打破 ODR :-/
-
即使使用
inline,多个定义的来源也必须相同,所以从这个意义上说,仍然只能有一个定义;它只是在几个翻译单元中重复。
标签: c++ c++17 one-definition-rule