通过临时变量初始化非const引用

时间:2015-08-04 04:41:42

标签: c++ reference

尝试对对象使用C ++引用时遇到以下错误。在引用this question之后,我明白这是因为A()返回临时变量,根据设计,它不允许被non-const reference引用。但是,我仍然很好奇为什么C ++以这种方式设计。为什么A& ra2 = A();无法作为A a1 = A(); A& ra1 = a1;的简写?已知MSVC通过扩展来支持这种语法,但是其他实现中不包括该扩展。这种速记有特别的缺点吗?

class A {
    public:
        int a = 0;
};

int main()
{
    A a1 = A();
    A& ra1 = a1;  //okay
    A& ra2 = A(); //error: invalid initialization of non-const reference of type ‘A&’ from an rvalue of type ‘A’
    return 0;
}

3 个答案:

答案 0 :(得分:1)

在第

A& ra2 = A(); 

=运算符的右侧求值为临时对象。您只能使用const&来引用临时对象。

该行

A& ra1 = a1;  //okay

起作用,因为a1不是临时对象,也不是const对象。

答案 1 :(得分:0)

A& ra2 = A();

ra2正在尝试引用临时变量。改变那个临时变量是没有任何意义的。所以,编译器禁止你做任何无意义的事情。

答案 2 :(得分:-2)

将引用视为具有编译时检查的花式指针,并且可能减少开销。

A& ra2 = A();

这说:

  1. 让我成为A类型的临时对象。
  2. 销毁那个临时对象。
  3. 制作一个“指针”指向那个不存在的临时对象。
  4. 这是检查输入的地方。编译器意识到这没有意义,并告诉你。

    你可能会对类似的语法感到困惑:

    A my_a = A();

    然而,这个例子截然不同。它说:

    1. 让我成为A类型的临时对象。
    2. 该临时对象复制到my_a(调用my_a的复制构造函数)
    3. 删除临时对象