为什么这个对象被认为是右值

Why is this object considered an rvalue?

本文关键字:认为是 对象 为什么      更新时间:2023-10-16

为什么我传递给ClassA构造函数的对象被认为是右值(临时的)?我知道将参数设置为 const 会使错误消失,但我想了解发生了什么。

此行为适用于函数调用,但不适用于构造函数?

#include <iostream>
using namespace std;
class ClassA {
public:
   ClassA() {}
   ClassA(ClassA&) {}
};
void f(ClassA&) {}
int main() {
   ClassA a;
   // Invalid initialization of non-const reference of type 'ClassA&' from an
   // rvalue of type 'ClassA'
   ClassA b = ClassA(a); 
   // Works fine
   f(a);
   return 0;
}

这里的右值是ClassA(a)表达式。

ClassA b = ClassA(a);

这就是复制初始化,因此它将尝试调用 ClassA 的复制构造函数,结果为 ClassA(a),这是一个右值。您已声明复制构造函数采用 ClassA& ,该构造函数无法绑定到右值,因此出现错误。

正如您所指出的,最好的解决方法是将const添加到复制构造函数,以便它可以绑定到 rvalues,但您也可以使用直接初始化或复制初始化而不进行类型转换:

ClassA b (a);
ClassA b {a}; //C++11
ClassA b = a;

请注意,尽管ClassA b = ClassA(a);需要一个有效的复制构造函数,但该副本可能会被省略。这目前是可选的,但在某些时候可能是强制性的。