标准在 12.1 p14 中"unspecified value"是什么意思?
What does the Standard mean by "unspecified value" in 12.1 p14?
12.1 p14:中术语"未指定值"的确切含义是什么
在构造const对象期间,如果对象的值或者通过不是直接或间接地从构造函数的this指针获得,由此获得的对象或子对象的值是未指定的。[示例:
struct C;
void no_opt(C*);
struct C {
int c;
C() : c(0) { no_opt(this); }
};
const C cobj;
void no_opt(C* cptr) {
int i = cobj.c * 100; // value of cobj.c is unspecified
cptr->c = 1;
cout << cobj.c * 100 // value of cobj.c is unspecified
<< ’n’;
}
-结束示例]
我可以在1.3.25中找到未指定行为的定义:
未指定行为
行为,对于格式良好的程序构造和正确的数据,这取决于实现
我在VS2010中运行了这个代码段,得到了上面两个表达式
cobj.c
的正确结果:第一个表达式为0
,最后一个为1
。这里没有说明什么?未指定行为的定义是否适用于未指定的值,即,这是否意味着在另一个编译器中我可以得到不同的结果?
我想说,关键是未指定的行为和实现定义的行为有何不同:
1.3.10
实现定义的行为
行为,对于格式良好的程序结构和正确的数据,这取决于实现和每个实现文档。1.3.25
未指定行为
行为,对于格式良好的程序构造和正确的数据,这取决于实现
未指定的值意味着标准不仅不需要特定的值,而且实现甚至不必记录(期望的)值(在这种情况下,值不仅可以在实现之间更改,还可以在版本之间更改,甚至从执行到执行)。这与实现定义的值不同。有了实现定义的值,您就知道将得到什么,但不同的实现会有所不同。对于未指定的值,您不知道将得到什么,因为它不一定会在实现中记录下来,甚至从执行到执行。
您的解释是正确的。该标准未规定该行为。使用此编译器可以得到预期的结果,但另一个编译器可能会给出不同的结果。如果你想将代码移植到另一个编译器,或者可能是你正在使用的编译器的另一个版本,你不应该依赖这种行为。
英语术语或多或少是逐字逐句使用的:"unspecified"表示标准没有给出精确的语义,但程序不会变得未定义或格式错误。
从字面上看,这意味着没有错误的答案。cobj.c
可能是任何int
值,这不会在编译器或运行时中构成错误。然而,现实地说,我认为有两种可能性;&cobj
和this
是相同的,在这种情况下,一切都按照您的预期工作,或者它们不同,并且您正在访问cobj
中潜在的垃圾数据。
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 为什么static_assert错误:即使我传递常量"expression must have a constant value"?
- 为什么我会" void value not ignored as it ought to be"?
- 方法错误"not all control paths return a value"和方法不返回值
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 如何在 c++ 中理解这样的代码 [request->headers().Method()->value().getStringView())]
- std::<key-value>不同类型的对向量
- c++ visual studio 64bit | save registers value
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 如何解决类成员函数中的"return a value"错误?
- bsoncxx: document::view vs document::value
- .value( "key" , default) 不适用于空的 json 对象吗?
- 如何在C++中设置演员的"Render Custom Depth Pass"和"Depth Stencil Value"?
- Qt 错误:QSqlQuery::value:尝试从表中检索统计信息时未定位在有效记录上 (QComboBox)
- 马洛克会在 C++17 年返回"invalid pointer value"吗?
- 如何将 v8::FunctionCallbackInfo<v8::Value> 数组从一个隔离复制到另一个隔离?
- std::value templated 方法的函数使用 clang 和 g++ 进行编译,但不使用 msvc 进行编译
- 无法使用 auto 来参数化true_type来检测 T::value()
- 为什么使用 "++value"会导致 -842150449?
- 标准在 12.1 p14 中"unspecified value"是什么意思?