问题标签 [one-definition-rule]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 谁能解释当前 C++0x 标准草案的这一段?
谁能从 ISO N3242 §3.2 第 2 点解释这个声明
类的非布局分配或释放函数由该类的构造函数的定义使用。一个类的非放置释放函数被该类的析构函数的定义使用,或者被虚拟析构函数定义点的查找选择(12.4)。 26 一个类的复制赋值函数由 12.8 中指定的另一个类的隐式定义的复制分配函数使用 odr。一个类的移动赋值函数被 12.8 中指定的另一个类的隐式定义的移动赋值函数 odr 使用。
ISO 标准 2003 说:
一个类的复制赋值函数被隐式定义的另一个类的复制赋值函数使用,如 12.8 中所指定。
这些陈述的实际区别是什么?
任何人都用示例/程序来解释上述附加点......?
我知道移动构造函数/移动分配函数->添加了新功能。
任何人都可以借助示例/程序来解释这一点吗?
请.............
请回答
c++ - 谁能解释当前 C++0x 标准草案的这一段?
谁能从 ISO N3242 §3.2 第 4 点解释这个声明
n3242 与 ISO 标准 2003 相比增加的部分:
4
如果以要求类类型完整的方式使用类,则翻译单元中只需要一个类的定义。如果满足以下条件,则类类型
T
必须是完整的:
- 声明了类型的非静态类数据成员
T
(9.2),或T
用作新表达式中的对象类型或数组元素类型- 类型
T
是 alignof 表达式 (5.3.6) 的主题,或- 异常声明具有类型
T
、引用T
或指向T
谁能解释当前 C++0x 标准草案的这一段?
在这些语句中添加它的实际含义是什么?
任何人都可以借助示例/程序来解释这一点吗?
c++ - 这可以在 C++ 中合法地完成吗?
注意:以下代码是非法的,但不需要符合要求的编译器拒绝它(有些则不需要)。
在我正在使用的库中,我有一个模板函数声明Foo
和一个模板函数定义Bar
in foobar.h
:
目的是其他代码可以像这样使用它:
问题: 有没有办法使这项工作也合法?
问题是(如果我理解正确的话)尽管编译,这在技术上是非法的:它违反了ODR,因为明确的专业化和使用Bar<MyClass>
count 作为定义,尽管事实上没有实体可以使用用例。
我想使用此模式进行参数化的原因Foo
是,由于我必须遵循样式指南,确保在定义之前以词法方式包含任何内容的唯一方法是Bar
将其包含在foobar.h
. 但是(出于我希望我不需要解释的原因)这不是首发。
c++ - 名称查找发现不同声明时的 ODR 违规
我一直在思考以下问题。考虑两个文件:
A.cpp:
B.cpp:
没有void g(int) {}
这个程序是 100% 有效的。使用void g(int) {}
,g(1)
解析为 A.cpp 中的模板版本和 B.cpp 中的非模板。
该程序是否违反 ODR?为什么?
c++ - 为什么在 C++ 中允许对 const 全局变量进行多重定义,而在 C 中却不允许?
由于单一定义规则,在 C 或 C++ 中不允许对全局变量进行多重定义。但是,在 C++ 中,一个 const 全局变量可以在多个编译单元中定义而不会出错。这与 C 中的不同。
为什么 C++ 允许这样做,而 C 不允许?与 C 相比,为什么 C++ 中 const 全局变量的用法和行为与非 const 全局变量有这种不同?关于 const,C++ 和 C 的幕后发生了什么?
例如,这在 C++ 中是允许的,但在 C 中是错误的:
这对 C 来说很好,但对 C++ 来说是错误的:
c++ - c&c++默认全局变量链接,多重声明&定义问题
例如:
代码1.c / .cpp
代码2.c / .cpp
去编译:
C 和 C++ 之间是否有任何全局变量链接差异?
r - 3d 中的正交距离回归
有谁知道如何为 3d 中的点模式找到最佳拟合线?
我对所谓的 ODR(正交距离回归)线感兴趣,它将所有点到线的欧几里德距离之和最小化。
r 中是否有针对此问题的功能,或者-如果没有-您能告诉我如何自己实现吗?
提前致谢!
c++ - Necessity of forward-declaring template functions
I recently created this example code to illustrate C++11 variadic template function usage.
If the first two lines which forward-declare foo
are omitted then this prints int:123int:123
instead. This surprised a certain experienced and knowledgeable C++ programmer.
He was convinced the forward-declarations shouldn't be necessary because the body won't be instantiated until the second phase of two-phase lookup. He thinks the compiler (gcc 4.6) has a bug.
I believe the compiler is right because the two foo
are different base template functions and the choice of base template needs to be locked-in during the first phase or else you could violate the one-definition rule by instantiating foo
before all versions of it have been defined and then again afterwards (consider how the linker assumes that redundant template function definitions are identical, interchangeable, and discardable).
So, who is right?
The above-linked GOTW nicely explains how and why function templates don't partially specialise, but the existence of variadic template functions seems to add to the confusion -- the intuition that foo<int,Tail...>
should be a partial specialisation of foo<Head,Tail...>
is stronger than that intuition for non-variadic functions, at least to me.
c++ - std::piecewise_construct 不会导致 ODR 违规吗?
std::piecewise_construct
,在 <utility> 中定义,自声明以来具有内部链接constexpr
。我想知道std::piecewise_construct
在标头中使用是否会违反 ODR。例如:
一个.hpp
翻译单元 1
翻译单元 2
TU 1 中的std::piecewise_construct
inf
指的是与f
TU 2 中不同的对象。我怀疑f
违反了 ODR。
N3290(也可能是 ISO/IEC 14882:2011)在 3.2/5 中表示以下情况是 ODR 的一个例外:
如果对象在 D 的所有定义中具有相同的文字类型,并且该对象使用常量表达式(5.19)初始化,并且值(但不是地址),则名称可以引用具有内部链接或没有链接的 const 对象该对象被使用,并且该对象在 D 的所有定义中具有相同的值;
f
满足几乎所有要求,但“使用对象的值(但不是地址)”对我来说似乎模棱两可。确实std::piecewise_construct_t
没有状态,但是调用 的分段构造函数std::pair
涉及调用 的隐式声明的复制构造函数std::piecewise_construct_t
,其参数是const std::piecewise_construct_t &
。地址被“使用”了,不是吗?
我很困惑。
参考: http: //lists.boost.org/Archives/boost/2007/06/123353.php
c++ - 匿名命名空间和单一定义规则
我是否违反了以下程序的单一定义规则?
和
和
最后
在上面,注意foo()
是定义在匿名命名空间中,所以我期望每个翻译单元m1.cpp
都会m2.cpp
得到自己的版本,所以没有违反 ODR。另一方面,bar()
它只是一个普通的旧内联函数,它恰好调用了 2 个不同foo
的 s。所以它违反了ODR,对吧?
更新:
以前我在定义中有宏,foo
它改变了它返回的值,m1
并且m2
在包含foo.hpp
. (对于前面的示例,g++
将生成一个二进制输出(i+j)
的值与您期望的值不同的值。)但实际上,即使该程序的主体foo()
相同,该程序也违反了 ODR。