从here:
我最初以为是这样,但是问题是magic_number
具有内部链接。由于它具有内部链接,因此它是否实质上就不会将magic_number
视为它们是不同翻译单元中的不同变量,因此不将其视为同一变量的多个定义吗?有人可以使用C++标准最新工作草案的引号来指定吗?
最佳答案
问题出在make_magic
上。 [basic.def.odr]/p6:
因为piecewise_construct
和magic_number
具有内部链接,所以当在多个翻译单元中定义内联函数make_magic
时,名称piecewise_construct
和magic_number
引用了不同的实体-TU 1的make_magic
将引用TU 1的piecewise_construct
和magic_number
,而TU 2的make_magic
将引用TU。 2的piecewise_construct
和magic_number
。由于存在问题的tuple
的构造函数通过引用获取参数,因此不执行左值到右值转换,对象被奇数次使用,第二个项目符号中的异常不适用,并且您违反了ODR。
(顺便说一句,std::tuple
没有piecewise_construct
构造函数,无论如何,这样的构造函数可能会以元组作为参数,而不是简单的int
,但这与本文试图提出的观点正交。)
关于c++ - 以下内容是否确实违反了ODR?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31643595/