我听说以下内容有效,并且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
仍未初始化吗?我有未定义的行为吗?
答案 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
还没有初始化了。