是`X x = x = X();`合法C++?

Luc*_*ore 7 c++ language-lawyer

我减少了这个:

struct A
{
   int * x;
   A() : x( x = new int() )
   {
   }
};
Run Code Online (Sandbox Code Playgroud)

以下内容:

int m = m = 3;
//or
struct X;
//...
X x = x = X();
Run Code Online (Sandbox Code Playgroud)

对我来说似乎合法.我不明白你为什么要这样做,但它合法吗?有没有你想要这样做的int情况(不是这样,我意识到这完全没用)?

Nic*_*las 17

这取决于你如何定义"合法".它会编译 ; 这并不意味着它可以保证工作.

在完整语句X x = ...执行之前,x未初始化.它还不是X.因此,当执行x = X()手段来创建临时X并调用X::operator=(const X&)未初始化的变量 x.

在尚未初始化的非POD类实例上调用函数(尚未调用其构造函数)会产生未定义的行为.如果X是POD类型(或C++ 11中的平凡),那么它将起作用.但否则没有.


Jam*_*nze 10

它在语法上是合法的,但会在运行时导致未定义的行为.在如下的声明中:

X x = x = X();
Run Code Online (Sandbox Code Playgroud)

第二个=是赋值,它分配给一个未初始化的变量.(第一个=只是说下面应该用于复制初始化的语法;它不是赋值.)