将右值绑定到左值引用 我有以下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.