引用C++草案N4713:
每个程序都应该包含在程序中odr-used的非内联函数或变量的唯一定义,除了在丢弃语句(9.4.1)之外。不需要诊断。定义可以明确出现在程序中,可以在标准或用户定义库中找到,或者(在适当的情况下)它是隐式定义的(参见15.1、15.4和15.8)。内联函数或变量应在每个翻译单元中定义,其中它在丢弃语句之外被odr-used。
在C++17之前的C++版本中,我可以通过只声明我的函数为inline来规避这个限制。C++17为变量添加了相同的功能。
此外,我认为inline关键字除了使忽略ODR成为可能之外,没有其他作用。
那么,为什么不在C++17中放弃整个规则呢?我看不出一个可以关闭的规则的目的。
每个程序都应该包含在程序中odr-used的非内联函数或变量的唯一定义,除了在丢弃语句(9.4.1)之外。不需要诊断。定义可以明确出现在程序中,可以在标准或用户定义库中找到,或者(在适当的情况下)它是隐式定义的(参见15.1、15.4和15.8)。内联函数或变量应在每个翻译单元中定义,其中它在丢弃语句之外被odr-used。
在C++17之前的C++版本中,我可以通过只声明我的函数为inline来规避这个限制。C++17为变量添加了相同的功能。
此外,我认为inline关键字除了使忽略ODR成为可能之外,没有其他作用。
那么,为什么不在C++17中放弃整个规则呢?我看不出一个可以关闭的规则的目的。