12.1 p14中未指定值的确切含义是什么:
在构造const对象期间,如果是对象的值 或者通过不是的glvalue访问它的任何子对象 直接或间接地从构造函数的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’;
}
-end example]
我可以在1.3.25中找到未指定行为的定义:
未指明的行为
行为,对于格式良好的程序构造和正确的数据,取决于实现
我在VS2010中运行此代码段,上面的两个表达式cobj.c
得到了正确的结果:第一个0
,最后一个1
。这里有什么未说明的?
未指定行为的定义是否适用于未指定的值,即是否意味着在另一个编译器中我可以得到不同的结果?
答案 0 :(得分:1)
您的解释是正确的。标准未指定该行为。您将获得此编译器所期望的结果,但另一个编译器可能会给出不同的结果。如果要将代码移植到另一个编译器,或者可能是您正在使用的其他版本的编译器,则不应该依赖此行为。
答案 1 :(得分:1)
英语术语或多或少地逐字使用:“未指定”意味着标准没有给出精确的语义,但程序不会变得不明确或形成不良。
答案 2 :(得分:0)
从字面上看,这意味着没有错误的答案。 cobj.c
可能会成为任何int
值,并且不会构成编译器或运行时中的错误。但实际上,我认为有两种可能性; &cobj
和this
都是相同的,在这种情况下,一切都按预期的方式运行,或者它们不同,并且您正在cobj
中访问潜在的垃圾数据。
答案 3 :(得分:0)
我想说的关键是未指明的行为和实现定义的行为的不同之处:
1.3.10
实施 - 定义行为
行为,对于格式良好的程序构造和正确的数据,取决于实现和每个实现文档。1.3.25
未指明的行为
行为,对于格式良好的程序构造和正确的数据,取决于实现
未指定值意味着标准不仅不需要特定值,而且实现甚至不必记录(预期)值(在这种情况下,值可能会更改)不只是从实现到实现,而是从版本到版本,甚至从执行到执行)。这与实现定义值不同。使用实现定义的值,您知道您将获得什么,但它因实现而异。如果没有指定值,您就不知道将要获得什么,因为它不一定记录在实现中,即使从执行到执行也是如此。