我简化了以下内容:
struct A
{
int * x;
A() : x( x = new int() )
{
}
};设置为以下内容:
int m = m = 3;
//or
struct X;
//...
X x = x = X();在我看来是合法的。我不明白你为什么要这么做,但这合法吗?有没有这样做的情况(不是int的情况,我意识到这是完全无用的)?
发布于 2012-03-26 16:46:57
这取决于你如何定义“合法”。它将会编译;但这并不意味着它一定能正常工作。
在执行完整的语句X x = ...之前,x是未初始化的。它还不是X。因此,执行x = X()意味着创建一个临时X,并在未初始化的变量x上调用X::operator=(const X&)。
在未初始化的非POD class实例上调用函数(尚未调用谁的构造函数)会产生未定义的行为。如果X是POD类型(或者在C++11中是微不足道的),那么它可以工作。但除此之外,不是。
发布于 2012-03-26 16:46:47
这在语法上是合法的,但在运行时会导致未定义的行为。在类似如下的语句中:
X x = x = X();第二个=是赋值,它赋值给一个未初始化的变量。(第一个=只是用来说明下面的内容应该用于复制初始化的语法;它不是赋值。)
发布于 2012-07-23 21:21:41
这是合法的语法。X在它自己的定义范围内。您可能希望对象引用其自身的一种情况是循环链表,如下所示:
struct Node {
Node( Node *pNext_ ) : pNext( pNext_ ) {
}
// ...
Node *pNext;
};
Node empty( &empty };这个空列表由一个具有到自身的链接的虚拟节点组成。这既是定义良好的,也是有用的。请注意,我们采用的地址为empty,即使Node是非POD且尚未构造,这也是合法的。我不认为在你的int m = m = 3;示例中允许赋值是直接有用的,但是语言很难既允许我的赋值又不允许你的赋值。
要了解这是如何传递到成员构造函数的,请考虑:
struct A {
Node list;
A() : list( &list ) {}
} 一旦名称在作用域中,也可以允许对其进行赋值。
https://stackoverflow.com/questions/9868921
复制相似问题