我想有一些我不明白的临时物品。 鉴于关系:
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
为什么?
答案 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
)也可以绑定。