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) {
...
}