为什么这个对象被认为是右值?
Why is this object considered an 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;
}
此处的右值为 ClassA(a)
表达式。
ClassA b = ClassA(a);
也就是copy-initialization,所以它会尝试用ClassA(a)
的结果调用ClassA
的拷贝构造函数,这是一个右值。您已经声明复制构造函数采用 ClassA&
,它不能绑定到右值,所以您得到一个错误。
正如您指出的那样,最好的解决方法是将 const
添加到复制构造函数,以便它可以绑定到右值,但您也可以使用 direct-initialization 或 copy-initialization 没有类型转换:
ClassA b (a);
ClassA b {a}; //C++11
ClassA b = a;
请注意,虽然 ClassA b = ClassA(a);
需要有效的 copy-constructor,但副本在某些时候可能会是 elided. This is currently optional, but may be made mandatory。
为什么我传递给 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);
也就是copy-initialization,所以它会尝试用ClassA(a)
的结果调用ClassA
的拷贝构造函数,这是一个右值。您已经声明复制构造函数采用 ClassA&
,它不能绑定到右值,所以您得到一个错误。
正如您指出的那样,最好的解决方法是将 const
添加到复制构造函数,以便它可以绑定到右值,但您也可以使用 direct-initialization 或 copy-initialization 没有类型转换:
ClassA b (a);
ClassA b {a}; //C++11
ClassA b = a;
请注意,虽然 ClassA b = ClassA(a);
需要有效的 copy-constructor,但副本在某些时候可能会是 elided. This is currently optional, but may be made mandatory。