标准在12.1 p14中的“未指定值”是什么意思?

时间:2013-12-29 19:31:41

标签: c++ c++11 constructor language-lawyer

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。这里有什么未说明的?

  • 未指定行为的定义是否适用于未指定的值,即是否意味着在另一个编译器中我可以得到不同的结果?

4 个答案:

答案 0 :(得分:1)

您的解释是正确的。标准未指定该行为。您将获得此编译器所期望的结果,但另一个编译器可能会给出不同的结果。如果要将代码移植到另一个编译器,或者可能是您正在使用的其他版本的编译器,则不应该依赖此行为。

答案 1 :(得分:1)

英语术语或多或少地逐字使用:“未指定”意味着标准没有给出精确的语义,但程序不会变得不明确或形成不良。

答案 2 :(得分:0)

从字面上看,这意味着没有错误的答案。 cobj.c可能会成为任何int值,并且不会构成编译器或运行时中的错误。但实际上,我认为有两种可能性; &cobjthis都是相同的,在这种情况下,一切都按预期的方式运行,或者它们不同,并且您正在cobj中访问潜在的垃圾数据。

答案 3 :(得分:0)

我想说的关键是未指明的行为实现定义的行为的不同之处:

  

1.3.10
  实施 - 定义行为
  行为,对于格式良好的程序构造和正确的数据,取决于实现和每个实现文档。

     

1.3.25
  未指明的行为
  行为,对于格式良好的程序构造和正确的数据,取决于实现

未指定值意味着标准不仅不需要特定值,而且实现甚至不必记录(预期)值(在这种情况下,值可能会更改)不只是从实现到实现,而是从版本到版本,甚至从执行到执行)。这与实现定义值不同。使用实现定义的值,您知道您将获得什么,但它因实现而异。如果没有指定值,您就不知道将要获得什么,因为它不一定记录在实现中,即使从执行到执行也是如此。