2015-03-18 94 views
4

我听说,下面是有效的和叶x未初始化的,好像它是int x;与指针本身初始化成员变量

int x = x; 

这个怎么样?这段代码是否与上面相同:

struct Foo 
{ 
    Foo(int Foo::*p) : x(this->*p) { } 
    int x; 
}; 

int main() { 
    Foo f(&Foo::x); 
} 

f.x还未初始化?我有没有未定义的行为?

+2

对于'int x = x'请参见[初始化是否需要左值到右值的转换?是'int x = x;'UB?](http://stackoverflow.com/q/14935722/1708801)和[C++标准在使用C++ 14中的不确定值和未定义行为方面发生了变化吗?] (http://stackoverflow.com/q/23415661/1708801)。 – 2015-03-18 20:51:56

回答

2

C++ 14清楚地表明,使用indeterminate value is undefined behavior,从节8.5重点矿山):

如果对象没有指定初始化,对象是 缺省初始化。 当获得用于与自动或 动态存储持续时间的对象存储,所述对象具有一个不确定的 值,并且如果没有初始化为对象进行,即 对象保留直到该值被替换 一个不确定的值(5.17 [expr.ass])。 [注:静态或线程存储的对象的持续时间为零初始化,请参阅3.6.2 [basic.start.init]。末端 音符] 如果一个不确定的值由评价产生时, 行为是未定义除了在下列情况下

唯一的例外在无符号字符的情况下被。这可能是为什么他们从改变的例子3.3.2节:

int x = 12; 
{ int x = x; } 

要:

unsigned char x = 12; 
{ unsigned char x = x; } 

我不认为这将排除你的榜样任何异常。

x有一个不确定的值,直到它被初始化为止,然后在调用未定义行为的初始化过程中访问它的值。

1

这段代码相当于上面:

我会这样想,是的,因为你基本上是做: x(x),只是用一个指针来读取的x的电流值作为输入值,但x尚未初始化。