0

我想我不明白关于临时对象的一些东西。鉴于关系:

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

为什么?

4

1 回答 1

3

非常量引用(如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&& baseC++11 中的右值引用(like )一样。

于 2012-06-11T17:11:16.947 回答