【问题标题】:Why is this object considered an rvalue?为什么这个对象被认为是一个右值?
【发布时间】:2016-01-27 11:17:32
【问题描述】:

为什么我传递给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;
}

【问题讨论】:

  • f(ClassA(a)) 也无效。

标签: c++ rvalue


【解决方案1】:

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

ClassA b = ClassA(a);

那是复制初始化,所以它会尝试调用ClassA的复制构造函数,结果为ClassA(a),这是一个右值。您已声明复制构造函数采用 ClassA&amp;,它无法绑定到右值,因此您会收到错误。

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

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

请注意,尽管ClassA b = ClassA(a); 需要有效的复制构造函数,但该副本可能是elided。这目前是可选的,但可能会在某个时候设为mandatory

【讨论】:

  • ClassA b = a; 也有效,也是复制构造。
猜你喜欢
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多