【发布时间】:2015-07-22 14:20:25
【问题描述】:
举个例子:
#include <iostream>
class A
{
public:
static const int numberOfWheels = 4;
};
// const int A::numberOfWheels;
int main()
{
std::cout << A::numberOfWheels << std::endl;
}
它是正式未定义的行为(UB),因为A::numberOfWheels 在没有定义的情况下使用? (另见here)。正如 C++03 所说:
如果使用该成员,仍应在命名空间范围内定义 在程序和命名空间范围定义中不得包含 初始化器。
我发现 C++03 中 used 的定义相当混乱,因为它指向 potentially-evaluated 表达式:
如果对象或非重载函数的名称出现在 潜在评估的表达式。
根据我的猜测,它不包括以下表达式:
sizeof(A::numberOfWheels) ;
typeid(A::numberOfWheels).name() ;
但不一定是像上面那样重载<< 运算符的表达式。
【问题讨论】:
-
已更新,缺陷报告 454 澄清了这一点,并在 2006 年更新了标准中的语言。
标签: c++ language-lawyer c++03