将右值绑定到左值引用 我有以下C++代码(VS2013): #包括 使用名称空间std; 甲级{ int i; 公众: A(int i):i(i){ 当然,用第一个参数1调用test会导致创建a类型的rvalue。rvalue可以分配给const-lvalue引用,但不能分配给普通的lvalue引用。如果您希望它在不使用const的情况下编译,您必须指定它该参数是一个rvalue参考
将右值绑定到左值引用 我有以下C++代码(VS2013): #包括 使用名称空间std; 甲级{ int i; 公众: A(int i):i(i){ 当然,用第一个参数1调用test会导致创建a类型的rvalue。rvalue可以分配给const-lvalue引用,但不能分配给普通的lvalue引用。如果您希望它在不使用const的情况下编译,您必须指定它该参数是一个rvalue参考,c++,constructor,type-conversion,copy-constructor,C++,Constructor,Type Conversion,Copy Constructor,g++error提供了更多的信息: error: cannot bind non-const lvalue reference of type ‘A&’ to an rvalue of type ‘A’ test(A(1), b, &b); rvalue可分配给rvalue引用或常量的左值引用。 为什么?右值是临时对象或文字。如果此代码合法 int&r=5 然后您就可以修改5。 另一方面,对const的左值引用禁止对它们引用的对象进行任何更改,因此您可以将它们绑定
g++
error提供了更多的信息:
error: cannot bind non-const lvalue reference of type ‘A&’ to an rvalue of type ‘A’
test(A(1), b, &b);
rvalue
可分配给rvalue引用
或常量的左值引用。
- 为什么?
右值是临时对象或文字。如果此代码合法
int&r
=5
然后您就可以修改5
。
另一方面,对const的左值引用
禁止对它们引用的对象进行任何更改,因此您可以将它们绑定到右值
关于第二个问题。您正在从test
返回a
的副本,因此*c
触发构建c
的副本。
请尝试从test
返回一个引用a
,以查看构造函数是否未被调用。好的,使用第一个参数1
调用test
会导致创建类型为a
的rvalue>。可以将rvalue分配给常量lvalue引用,但不能分配给普通lvalue
reference。如果要在不使用const
的情况下对其进行编译,则必须指定参数为rvalue
引用
g++
error提供了更多的信息:
error: cannot bind non-const lvalue reference of type ‘A&’ to an rvalue of type ‘A’
test(A(1), b, &b);
rvalue
可分配给rvalue引用
或常量的左值引用。
- 为什么?
右值是临时对象或文字。如果此代码合法
int&r
=5
然后您就可以修改5
。
另一方面,对const的左值引用
禁止对它们引用的对象进行任何更改,因此您可以将它们绑定到右值
关于第二个问题。您正在从test
返回a
的副本,因此*c
触发构建c
的副本。
尝试从test
返回一个引用a
,以查看构造函数是否未被调用。i(i)
抖动。请使用更大胆的命名…@Gil您是否回答了第二个问题?可能重复i(i)
发抖。请使用更大胆的命名…@Gil你回答第二个问题了吗?可能重复A&&xxx=1;
和A xxxx=1;
之间的区别是什么?@dragonxlwang第一个是对右值的引用(=/code>符号右侧的临时匿名1
)而第二个是正常变量,1
被复制到其中。a&&xxx=1;
和a xxxx=1;
之间有什么区别?@dragonxlwang第一个是对右值的引用(=/code>符号右侧的临时匿名1
)而第二个是正常变量,1
被复制到该变量中。
const A& x = 1; //compile
x = 2; //error!
A&& xxx = 1; //compile
A& xx = 1; //does not compile.