带初始化程序的静态数据成员

时间:2015-02-16 00:57:39

标签: c++ c++11

假设一个永远不会使用odr,是否有一个好处是声明一个static conststatic constexpr数据成员初始化程序而不是声明然后再定义一个?不需要定义是否有好处?

1 个答案:

答案 0 :(得分:1)

首先,请注意您无法定义声明它的static const数据成员。无论您做什么(例如提供初始化程序),声明都不会成为定义。但是,static constexpr数据成员不需要定义,如果从不使用ODR,则带有初始化程序的整数类型的static const数据成员不需要定义。

ODR:一个定义规则,在C ++ 11标准§3.2[basic.def.odr]中。

在头文件中提供定义并非易事 - 对于非模板类,直接方法会导致违反ODR的行为,并且链接器会抱怨。因此,没有定义的好处是它使得使用仅标题模块变得容易。定义的好处是它可以很容易地使用任何类型,并支持ODR使用。

对于仅使用标题的模块,已经有很多SO问题涉及ODR使用定义要求的实用解决方案。

ODR对此模板有特殊豁免,这是一个实用解决方案的基础。只需在类模板中提供定义,并使用伪参数来实例化模板。另一个实际的解决方案是将定义放在一个函数中,基本上是Meyers的单例。