我想我不明白关于临时对象的一些东西。鉴于关系:
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
为什么?
我想我不明白关于临时对象的一些东西。鉴于关系:
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
为什么?
非常量引用(如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
但是,这两个都无法编译,因为两者都会尝试将右值表达式的结果绑定C()
到非常量引用B& base
。
const 引用(like B const& base
)可以绑定到右值,就像B&& base
C++11 中的右值引用(like )一样。