传递临时的concreate派生对象,其中对所需的抽象基础的引用不起作用?

时间:2012-06-11 17:09:08

标签: c++ constructor reference

我想有一些我不明白的临时物品。 鉴于关系:

class C {};

class F {
public:
    C getC() { return C(); };
};

class N {
public:
    N( C & base ){};
};

这有效:

N n(C());

这不起作用:

F f;
N n(f.getC()); //compile error

为什么?

1 个答案:

答案 0 :(得分:3)

非const引用(如B& base)只能绑定到左值。

F::getC()按值返回C个对象,因此调用表达式f.getC()是右值,而不是左值。


然而,N n(C());起作用的原因是由于一个无关的问题。

这不会声明对象。它声明了一个名为n的函数,它返回N并获取一个类型为“指向函数的指针,该函数没有参数并返回C。”

这是语言特性的一种表现形式,称为最令人烦恼的解析。要更改此项以声明对象,您需要以下之一:

N n = C();  // Use copy initialization
N n((C())); // Use more parentheses

但是,这两个都无法编译,因为两者都会尝试将rvalue表达式C()的结果绑定到非const引用B& base


const引用(如B const& base)可以绑定到rvalue,C ++ 11中的右值引用(如B&& base)也可以绑定。