是否有理由我们能够在类定义中定义 [static const int] 而不能在其他静态 const 类型中定义? [复制]
Posted
技术标签:
【中文标题】是否有理由我们能够在类定义中定义 [static const int] 而不能在其他静态 const 类型中定义? [复制]【英文标题】:Is there reason we are able to define [static const int] in a class definition, but not other static const types? [duplicate] 【发布时间】:2012-01-10 23:07:49 【问题描述】:可能重复:Why aren't static const floats allowed?
有什么理由说明这在 C++ 中是不可能的吗?这让我很困惑。
static const int A = 100; //no error
static const float B = 2.0f; //error, can't define this type in class definition.
【问题讨论】:
ODR 到底是什么? :) One Definition Rule。围绕“ODR 使用”的细节是模糊的,但主要可以概括为需要一个对象的地址。 编辑:对不起,我误解了 OP 是指静态数据成员。 请展示一个完整的最小示例,该示例因B
的形式而失败,因为我无法重现此内容。
【参考方案1】:
integral 类型的静态常量可以在类定义中初始化。这并不意味着该对象确实存在,因为您还没有提供定义,而是因为编译器知道该对象的 值,所以您有时可以侥幸逃脱。
也就是说,如果您不尝试获取变量的地址或通过引用传递它,而只使用它的值,那么您根本不需要提供定义, 编译器只是简单地替换你使用变量的值。
C++11 引入了 constexpr
关键字,它允许您对更广泛的类型执行相同操作。
【讨论】:
那么,在标头中定义的静态 const int 表现得像文字? @xcrypt:不是“在头文件中定义”,而是“在类定义中”(正如 Kerrek 正确所说)。标题或#include
没有什么特别之处。
@BenVoigt,我在哪里提到了#include?请冷静下来。 :)
@xcrypt:那么在您看来,标头与任何其他文件的真正区别是什么?
@BenVoigt 我明白你的意思。然而,我学会了一种编码风格,我几乎总是使用标题来定义类,所以我搞混了。以上是关于是否有理由我们能够在类定义中定义 [static const int] 而不能在其他静态 const 类型中定义? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
是否有正当理由在C程序的main()函数中声明变量static?
错误:在类计算中找不到主方法,请将主方法定义为:public static void main(String[] args) [重复]