C++ 是不是;“潜在评估”;指与“相同”的内容;“已使用的odr”;在C++;03?

C++ 是不是;“潜在评估”;指与“相同”的内容;“已使用的odr”;在C++;03?,c++,language-lawyer,c++03,C++,Language Lawyer,C++03,举个例子: #include <iostream> class A { public: static const int numberOfWheels = 4; }; // const int A::numberOfWheels; int main() { std::cout << A::numberOfWheels << std::endl; } 但不一定是这两个缺陷报告中重载的表达式,其目的似乎是它应该与使用的odr非常相似:它说(

举个例子:

#include <iostream>

class A
{
public:
    static const int numberOfWheels = 4;
};

// const int A::numberOfWheels;

int main()
{
    std::cout << A::numberOfWheels << std::endl;
}

但不一定是这两个缺陷报告中重载的
表达式,其目的似乎是它应该与使用的odr非常相似:它说(重点是我的未来):

最初,所有静态数据成员仍然必须在外部定义 不管他们是否被使用,这个班级都会受到影响

但是这个限制应该被取消,这样静态数据 成员不需要在类之外定义,除非它们在类中使用 需要其定义的方式,与 命名空间范围变量。特别是,如果整数/枚举常量 静态数据成员在类内初始化,其地址为 从未采取过,我们一致认为没有名称空间范围定义 必需。

此修改的
3.2p2
如下所示:

除非表达式出现在 需要积分常数表达式(见5.19[expr.const]), 是sizeof运算符(5.3.3[expr.sizeof])的操作数,或者是 typeid运算符的操作数与表达式不匹配 指定多态类类型的左值(5.2.8[expr.typeid])

以及:

3.2 basic.def.odr第2段中关于“潜在 “评估”是不完整的。它不区分表达式 作为“积分常数表达式”使用,以及 不它也不区分对象地址的用途 被拿走的和没有被拿走的。(A)适当的定义 “地址被占用”可以写出来,但实际上不说“地址”。)

但标准中的措辞并未修改,以包含缺陷报告中的声明意图,也不清楚原因,只是增加了需要整数常量表达式的例外情况

更新

最后,将标准的措辞与缺陷报告48中表达的意图进行了同步,并指出:

作为核心问题48的解决方案,当前C++ 该标准与现有实践和用户不同步 对于具有常量的静态数据成员的定义的期望 涉及整数或常量枚举类型。基本上什么 当前的实现只需要在 取常数的地址。例如:

void f() {

  std::string s;
  ... 

  // current implementations don't require a definition
  if (s.find('a', 3) == std::string::npos) {
   ...
  }
然而,按照标准的字面意思,上面需要一个定义 由于表达式std::string::npos可能是 评价的。我认为这个问题很容易用简单的方法解决 第4、9.4.2段中9.4.2类静态数据的更改 class.static.data第5段和3.2 basic.def.odr第3段


< C++ > 03节[Basic .DEF.ODR]是用来覆盖我们认为ODR使用的规则从C++ 11接近的。随后对C++11规则进行了更改,使C++11更接近C++14规则。

更新的缺陷报告454对此进行了澄清,并在2006年更新了标准中的语言。
void f() {

  std::string s;
  ... 

  // current implementations don't require a definition
  if (s.find('a', 3) == std::string::npos) {
   ...
  }