[英]Binding rvalue to lvalue reference
我有以下C ++代码(VS2013):
#include <iostream>
using namespace std;
class A {
int i;
public:
A(int i) : i(i) {
cout << "Constructor: " << i << endl;
}
A(const A &o) : i(o.i) {
cout << "Copy constructor: " << i << endl;
}
~A() {
cout << "Destructor: " << i << endl;
}
};
A test(const A &a, A b, A *c) {
return *c;
}
int main() {
A b(10);
cout << "START OF TEST" << endl;
test(1, b, &b);
cout << "END OF TEST" << endl;
system("pause");
}
运行代码时,在“测试开始”和“测试结束”输出之间得到以下输出:
构造函数:1
复制构造函数:10
复制构造函数:10
毁灭者:10
毁灭者:10
析构函数:1
构建3个对象:1个使用整数1
个使用A
类(i = 10)的对象。
值得一提的是,当test
函数的参数const A &a
更改为A &a
(不是常量)时,程序将无法编译,并出现以下错误:
错误C2664:'A test(A&,A,A *)':无法将参数1从'int'转换为'A&'
如何解释这种行为?
特别:
为什么发送整数1
来test
A的参数构造函数A(int i)
有效(并且仅在使用const
时)?
为什么A的副本构造函数A(const A&o)工作两次? (一次调用test
发生,另一次返回*c
)。
好吧,使用第一个参数1
调用test
会导致创建类型A
的rvalue
。 可以将右值分配给const lvalue reference
但不能分配给普通lvalue
引用。 如果要在不使用const
情况下进行编译,则必须指定该参数为rvalue
引用。
g++
错误会提供更多信息:
error: cannot bind non-const lvalue reference of type ‘A&’ to an rvalue of type ‘A’
test(A(1), b, &b);
rvalue
分配lvalue reference to const
的rvalue reference
或lvalue reference to const
。 这是为什么? rvalues
是临时对象或文字。 如果此代码合法
int &r
= 5
那么您将能够修改5
。 另一方面, lvalue references to const
禁止对其引用的对象进行任何更改,因此您可以将它们绑定到rvalue
。
const A& x = 1; //compile
x = 2; //error!
A&& xxx = 1; //compile
A& xx = 1; //does not compile.
关于第二个问题。 您在返回的副本A
从test
使*c
触发副本建设c
。 尝试从test
返回引用A
,以查看未调用构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.