Questions tagged «one-definition-rule»

15
什么时候应该为函数/方法编写关键字“ inline”?
Наэтотвопросестьответына 堆栈溢出нарусском:Когдаследуетиспользовать直列дляфункции/метода? 什么时候应该inline为C ++中的函数/方法编写关键字? 在看到一些答案之后,一些相关的问题: 何时应不写关键字“内联”在C ++函数/方法? 编译器何时不知道何时使函数/方法“内联”? 当一个应用程序为函数/方法写“内联”时,如果一个应用程序是多线程的,这有关系吗?

2
“使用ODR”是什么意思?
这只是在另一个问题的背景下出现的。 显然,仅在使用ODR时才实例化类模板中的成员函数。有人可以解释这到底意味着什么。在上一个定义规则(ODR),维基百科的文章并没有提及“ ODR使用”。 但是该标准将其定义为 除非其对象满足在常量表达式中出现的要求(5.19)并且立即应用左值到右值转换(4.1),否则将使用其名称显示为可能评估的表达式的变量。 在[basic.def.odr]中。 编辑:显然这是错误的部分,整个段落包含针对不同事物的多个定义。这可能与类模板成员函数有关: 如果非重载函数的名称显示为可能评估的表达式或一组候选函数的成员,则如果非重载函数是纯虚函数,则如果通过重载解析从潜在评估的表达式中进行引用而选择了非重载函数,则该名称不会被使用函数及其名称未明确限定。 但是我不明白,该规则如何在多个编译单元中起作用?如果显式实例化类模板,是否会实例化所有成员函数?

2
可以在头文件中使用lambda违反ODR吗?
可以将以下内容写在头文件中: inline void f () { std::function<void ()> func = [] {}; } 要么 class C { std::function<void ()> func = [] {}; C () {} }; 我猜在每个源文件中,lambda的类型可能不同,因此std::function(target_type的结果中包含的类型会有所不同)。 尽管看起来像是一种常见模式并且是合理的做法,但这是否违反了ODR(一个定义规则)?第二个样本是否每次都违反ODR?或者仅在头文件中至少有一个构造函数时才违反?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.