one-definition-rule相关内容
我最近创建了这个示例代码来说明C ++ 11变量模板函数的用法。 typename ... Tail> void foo(Head,Tail ...); template void foo(int,Tail ...); void foo(){} template void foo(int x
..
在“Google C ++样式指南”中,命名空间部分“ 我理解为什么要使用未命名的命名空间在头文件中容易导致违反C ++ One Definition Rule(ODR)在实施文件中使用未命名的命名空间可能会导致ODR违规,但不会影响标题中的使用方式。 原因是如果你真的在匿名 命名空间中使用任何东西,你有未定义的行为风险。例如: 命名空间{ double const pi = 3
..
在“Google C ++样式指南”中,命名空间部分“ 我理解为什么要使用未命名的命名空间在头文件中容易导致违反C ++ One Definition Rule(ODR)在实施文件中使用未命名的命名空间可能会导致ODR违规,但不会影响标题中的使用方式。 原因是如果你真的在匿名 命名空间中使用任何东西,你有未定义的行为风险。例如: 命名空间{ double const pi = 3
..
考虑下面的源文件 1.cpp #include using namespace std; struct X { X() { cout
..
我知道有很多类似的问题,但有些不同的问题。它是关于以下情况: #include #include template class MyClass { public: static constexpr std :: array ARRAY {{4,3,1,5}}; }; int main(
..
C ++ 03 3.2.2 ...如果对象或非重载函数的名称出现在潜在求值表达。如果它不是纯的,则使用虚拟成员函数... 然后在 我们有: 每个程序都应该包含在该程序中使用的每个非内联函数或对象的一个定义;无需诊断。定义可以在程序中显式显示,它可以在标准或用户定义的库中找到,或者(在适当的时候)被隐式定义(见12.1,12.4和12.8)。 在使用它的每个翻译单元中都必须定义一个内联函
..
C ++ 14草案(N3936)在§3.2/ 3中规定: 一个变量x, - 评估表达式ex是odr使用,除非对x应用lvalue-to-rvalue转换(4.1)产生不调用任何非平凡函数的常量表达式(5.19),并且如果x是对象,则ex是元素表达式e的潜在结果集合,其中左值到右值转换(4.1)应用于e,或e是丢弃值表达式(条款5)。 这对我没有任何意义:如果表达式 e 是一个舍弃值表达
..
在下面, static constexpr member L 在类中初始化 A ,然后通过值或(通用)引用传递。后者在Clang中失败,但在GCC中失败,并且成员/非成员函数的行为略有不同。更详细的: #include using namespace std; struct A { static constexpr size_t L = 4;
..
我违反了单一定义规则与以下程序? // foo.hpp #ifndef FOO_HPP_ #define FOO_HPP_ 命名空间{ inline int foo(){ return 1; } } inline int bar(){ return foo(); } #endif // EOF p> // m1.cpp
..
另一个 static 问题。 我已阅读以下内容: 什么是静态变量? 文件范围和静态浮动 http://msdn.microsoft.com/zh-CN/library/s1sb61xd.aspx 我仍然无法理解以下行为: 我有一个 h 文件: // StaticTest.h #include static int counter = 0;
..
根据c ++标准: 无翻译单元应包含任何 变量的定义,类类型,枚举类型或模板。 // - translation_unit.cpp-- // int a; void foo() { int a; //第二次捍卫a。 ODR失败。你能解释一下ODR是如何工作的吗? $ b 解决方案 这不会违反规则,因为你定义了两个不同的变量。它们具有相同的名称,
..
可以在头文件中写入以下内容: inline void f(){std :: function func = [] {}; } 或 class C {std :: function func = [] {}; C () {} }; 我猜在每个源文件中,lambda的类型可能不同,因此在 std :: funct
..
这只是在另一个问题。 显然,类模板中的成员函数只有在使用ODR时才被实例化。 有人可以解释一下究竟是什么意思。 维基百科的ODR文章没有提及“ ODR使用”。 但是标准定义为 一个变量,其名称显示为潜在计算表达式 是 odr-used ,除非它是一个满足 出现在常量表达式(5.19)和左值到右值 转换4.1)立即应用。 编辑:显然这是错误的部分,整个段落包含多个定义
..
这可能是一个不寻常的问题,因为它要求更全面的解释给一个简短的回答另一个问题以及与之相关的C ++ 11标准的一些方面。 为了便于参考,我将在这里总结引用的问题。 OP定义了一个类: struct Account { static constexpr int period = 30; void foo(const int&){} void bar(){foo(period
..
考虑这两个函数: void foo(){} void bar(){} 是保证& foo!=& bar 同样, 模板 ? MSVC积极地COMDAT折叠函数,因此具有相同实现的两
..
我应该何时在C ++中为函数/方法写关键字 inline ? ,一些相关问题: 我应该何时不将关键字'inline' /方法在C ++中? 编译器什么时候不知道何时创建函数/方法'inline' b $ b 如果应用程序多线程在为某个函数/方法写入'inline'时是否重要? 解决方案 哦,男人,我的宠物狗。 inline 比指令更像是 static 或 exte
..
我看了又看有关ODR在C ++标准的相关条款,但这个问题仍然向我敞开。标准说,内联函数的定义应出现在每个转换单元在其被使用,并且该定义应是其中几乎在一个页中记载的感相同。它说,该令牌序列必须是相同的。是否包括本地标识符名称? 在换句话说 请问下面的程序违反ODR?的(我试图与Visual Studio 2008测试它自己,得到0错误和0警告。但我猜这并不能证明什么,因为我再变为例,两种完全不同的
..
当我编译如下在code #包括LT&;&stdio.h中GT;诠释的main() { int类型的; INT A = 10; 的printf(“一为%d \\ n”,一); 返回0; } 我得到一个错误: test3.c:在函数'主': test3.c:6:5:错误:的“A”再次声明,没有联动 test3.c:5:5:注:“a”是这里previous声明 但是,如果我把这
..
例如: code1.c /的.cpp int类型的;// ... 等等 code2.c /的.cpp int类型的;诠释主要(无效){ 返回0; } 去编译: $ gcc的code1.c $ C $#c2.c这是罚款 $$ G ++ code1.cpp $ C $#c2.cpp这是死 /tmp/ccLY66HQ.o:(.bss+0x0):'A'的多重定义 /tmp
..
全局变量的多重定义不C或C ++允许由于在一个定义规则。然而,在C ++中一个const全局变量可以在多个编译单元,没有错误定义。这是不一样的在C 为什么C ++允许这个而C不?为什么一个const全球的使用和行为从非const全局++中这种方式使用C和C相比有什么不同?什么是用C ++和C就在幕后发生的事情为const? 例如这是允许在C ++中,但错在C: // Foo.cpp中 co
..