繁体   English   中英

将右值绑定到左值引用

[英]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. 为什么发送整数1test A的参数构造函数A(int i)有效(并且仅在使用const时)?

  2. 为什么A的副本构造函数A(const A&o)工作两次? (一次调用test发生,另一次返回*c )。

好吧,使用第一个参数1调用test会导致创建类型Arvalue 可以将右值分配给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 constrvalue referencelvalue 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.

关于第二个问题。 您在返回的副本Atest使*c触发副本建设c 尝试从test返回引用A ,以查看未调用构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM