首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`X x=x= X();`是否合法C++?

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

Stack Overflow用户
提问于 2012-03-26 16:36:35
回答 4查看 552关注 0票数 7

我简化了以下内容:

代码语言:javascript
复制
struct A
{
   int * x;
   A() : x( x = new int() )
   {
   }
};

设置为以下内容:

代码语言:javascript
复制
int m = m = 3;
//or
struct X;
//...
X x = x = X();

在我看来是合法的。我不明白你为什么要这么做,但这合法吗?有没有这样做的情况(不是int的情况,我意识到这是完全无用的)?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-26 16:46:57

这取决于你如何定义“合法”。它将会编译;但这并不意味着它一定能正常工作。

在执行完整的语句X x = ...之前,x是未初始化的。它还不是X。因此,执行x = X()意味着创建一个临时X,并在未初始化的变量x上调用X::operator=(const X&)

在未初始化的非POD class实例上调用函数(尚未调用谁的构造函数)会产生未定义的行为。如果X是POD类型(或者在C++11中是微不足道的),那么它可以工作。但除此之外,不是。

票数 17
EN

Stack Overflow用户

发布于 2012-03-26 16:46:47

这在语法上是合法的,但在运行时会导致未定义的行为。在类似如下的语句中:

代码语言:javascript
复制
X x = x = X();

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

票数 10
EN

Stack Overflow用户

发布于 2012-07-23 21:21:41

这是合法的语法。X在它自己的定义范围内。您可能希望对象引用其自身的一种情况是循环链表,如下所示:

代码语言:javascript
复制
struct Node {
    Node( Node *pNext_ ) : pNext( pNext_ ) {
    }
    // ...
    Node *pNext;
};

Node empty( &empty };

这个空列表由一个具有到自身的链接的虚拟节点组成。这既是定义良好的,也是有用的。请注意,我们采用的地址为empty,即使Node是非POD且尚未构造,这也是合法的。我不认为在你的int m = m = 3;示例中允许赋值是直接有用的,但是语言很难既允许我的赋值又不允许你的赋值。

要了解这是如何传递到成员构造函数的,请考虑:

代码语言:javascript
复制
struct A {
    Node list;
    A() : list( &list ) {}
}  

一旦名称在作用域中,也可以允许对其进行赋值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9868921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档