使用指向自身的指针初始化成员变量

时间:2015-03-18 20:49:40

标签: c++ initialization undefined-behavior pointer-to-member

我听说以下内容有效,并且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 个答案:

答案 0 :(得分:2)

C ++ 14明确指出使用8.5部分{{1>}(强调我的):

  

如果没有为对象指定初始化程序,则该对象为   默认初始化。 使用自动或自动存储对象时   获得动态存储持续时间,该对象具有不确定性   值,如果没有为对象执行初始化,那么   对象保留不确定的值,直到该值被替换为   (5.17 [expr.ass])。 [注意:具有静态或线程存储的对象   持续时间为零初始化,见3.6.2 [basic.start.init]。 -结束   note] 如果评估产生了不确定的值,那么   除以下情况外,行为未定义

唯一的例外是unsigned char。这可能就是为什么他们改变了示例部分3.3.2:

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

要:

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

我没有看到任何排除你的例子的例外。

x具有不确定的值,直到它被初始化,然后在初始化期间访问其值,从而调用未定义的行为。

答案 1 :(得分:1)

  

此代码是否与上述代码相同:

我会这么认为,是的,因为你实际上在做: x(x),只是使用指针来读取x的当前值作为输入值,但是x还没有初始化了。