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

Zhr*_*hro 4 c++ rvalue

为什么我传递给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;
}
Run Code Online (Sandbox Code Playgroud)

Tar*_*ama 10

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

ClassA b = ClassA(a);
Run Code Online (Sandbox Code Playgroud)

这是复制初始化,因此它将尝试ClassA使用结果调用复制构造函数ClassA(a),这是一个rvalue.您已声明复制构造函数采用a ClassA&,它无法绑定到rvalues,因此您会收到错误.

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

ClassA b (a);
ClassA b {a}; //C++11
ClassA b = a;
Run Code Online (Sandbox Code Playgroud)

请注意,虽然ClassA b = ClassA(a);需要有效的复制构造函数,但副本可能会被删除.这是目前可选的,但可能在某些时候是强制性的.