繁体   English   中英

为什么int不能用作返回类型的l值而用户定义的类可以?

[英]Why can int not be used as an l-value of a return type while a user-defined class can?

struct A {};

A f1()
{
    return A();
}

int f2()
{
    return int();
}

int main()
{
    f1() = A();   // OK
    f2() = int(); // error C2106: '=' : left operand must be l-value
}

为什么f1() = A(); 好的,而f2() = int(); 失败了?

f1()返回A的实例。 由于您没有覆盖复制/移动赋值运算符,编译器会为您生成一个。 你实际上是在调用一个成员函数:

f1() = A(); // calls A& operator=(A&&)

第二个不起作用,因为int不是类类型。

函数f1返回一个rvalue,它可能变成一个xvalue(一个“eXpiring”值)。 函数f2返回一个内置类型,它是一个值为prvalue(“纯”rvalue)的右值。

从3.10 [Lvalues and rvalues]

- xvalue(“eXpiring”值)也指对象,通常接近其生命周期的末尾(例如,可以移动其资源)。 xvalue是涉及rvalue引用的某些表达式的结果(8.3.2)。

因此,由于隐式移动操作,A的分配变得有效。

将A更改为:

struct A {
    A() {}
    A(A&&) = delete;
    A& operator = (const A&) { return *this; }
};

产生:错误:使用已删除的函数'A :: A(A &&)'和g ++(Ubuntu / Linaro 4.7.2-2ubuntu1)4.7.2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM