标准在 12.1 p14 中"unspecified value"是什么意思?

What does the Standard mean by "unspecified value" in 12.1 p14?

本文关键字:unspecified value 意思 是什么 p14 标准      更新时间:2023-10-16

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值,这不会在编译器或运行时中构成错误。然而,现实地说,我认为有两种可能性;&cobjthis是相同的,在这种情况下,一切都按照您的预期工作,或者它们不同,并且您正在访问cobj中潜在的垃圾数据。