当前位置: 首页 > 知识库问答 >
问题:

在头文件中使用常量与ODR兼容

岳亮
2023-03-14

在看另一个问题时,我意识到我不能通过头文件使用来自匿名名称空间的对象或函数,因为这会在类定义或内联函数中导致ODR冲突。如果是这种情况,那么是否可以安全地在内联函数或类中使用命名的constconstexprstatic对象?例如,如果constantnamespace下面的内部,那么它将是不安全的,但是使用静态链接的常量可以吗?

// some header file to be included by multiple .cpp files
static const/*expr*/ int CONSTANT = 2;

inline int f() {
  return CONSTANT;
}

class Cls {
  int mem = CONSTANT;
};

共有1个答案

申思远
2023-03-14

这个代码是可以的。整段(C++14[basic.def.odr/6.2])为:

d的每个定义中,根据3.4查找的相应名称应指在d定义内定义的实体,或者在重载html" target="_blank">解析和部分模板专门化匹配后应指同一实体,但如果对象在d的所有定义中具有相同的文字类型,并且对象是用常量表达式初始化的,并且对象没有ODR使用,并且对象在d的所有定义中具有相同的值,则名称可指具有内部或无链接的非易失性常量对象;而且

此用法与“except...and...and...”部分中的所有条件都匹配:

  • 名称constant实际上是指具有内部链接的非易失性const对象
  • 它在f()的所有定义中具有相同的文字类型。
  • 它是用常量表达式2初始化的。
  • 它不是ODR使用的。
  • 它在f()的所有定义中具有相同的值。

“it is not ODR used”的意思是“it is onot ODR used inf()”--也就是说,如果您碰巧在程序的其他地方ODR useconstant,它不会破坏f()

 类似资料:
  • 我有一个spring boot应用程序,希望使用枚举常量来指定如下所示的值,但是,编译器生成了一个错误“类型不匹配:无法从常量转换为字符串”。下面是代码块 我知道我可以使用公共静态字符串代替枚举,但我想知道是否可以使用枚举常量?

  • 3.2 ROS中的头文件与源文件 本节主要介绍ROS的C++实现中,如何使用头文件与源文件的方式封装代码,具体内容如下: 设置头文件,可执行文件作为源文件; 分别设置头文件,源文件与可执行文件。 在ROS中关于头文件的使用,核心内容在于CMakeLists.txt文件的配置,不同的封装方式,配置上也有差异。

  • 问题内容: 我正在尝试使用Django模板引擎或任何其他方式创建 动态 CSS文件。 目前,我有一个CSS规则,如下所示: Where对应于Python中的变量。理论上,使用Django模板引擎,我可以这样写: 我的问题是,如何使用Django模板引擎(或任何其他方式)动态生成CSS? 问题答案: 您基本上有两个选择: 动态地为CSS提供服务,并在urls.py等中添加一个条目,就好像它是HTML

  • 问题内容: 显然,停止托管带有码头9-404 错误的文件 (与码头8兼容)。这是代码: 这quistion与接受的答案似乎不是对着干不会 码头9 - 提供静态文件瓦特/嵌入式码头 问题答案: 假设这是一个 (注意:最好不要是realical,因为这是一个内部类,不能直接实例化) 然后,将永远不会调用,因为链末尾的处理(或)将始终响应,甚至无法执行。 如果你有一个,不采用使用该设置并为您的静态文件。

  • ODR

    ODR代表Orthogonal Distance Regression ,用于回归研究。 基本线性回归通常用于通过绘制图表上的最佳拟合线来估计两个变量y和x之间的关系。 用于此的数学方法称为Least Squares ,旨在最小化每个点的平方误差之和。 这里的关键问题是如何计算每个点的误差(也称为残差)? 在标准线性回归中,目标是从X值预测Y值 - 因此明智的做法是计算Y值中的误差(如下图中的灰线

  • 本文向大家介绍浅谈头文件algorithm中的常用函数,包括了浅谈头文件algorithm中的常用函数的使用技巧和注意事项,需要的朋友参考一下 一、非修改性序列操作(12个) 循环         对序列中的每个元素执行某操作         for_each() 查找         在序列中找出某个值的第一次出现的位置         find() 在序列中找出符合某谓词的第一个元素