由&&amp ;;宣布的变量

时间:2015-12-27 10:24:27

标签: c++ c++11 rvalue-reference

考虑(x | r | l | pr | gl)值,我想到了以下问题:

考虑以下两个变量声明:

X x = ...;

X&& x = ...;

并假设...执行而非提供xvalue。

任何人都可以使用decltype来解释代码而不是吗?在这两种情况下,(x)都会使用X类型的左值,不是吗?

2 个答案:

答案 0 :(得分:6)

也许是人为的例子,但是用

struct X
{
    X() = default;
    X(const X&) = delete;
    X operator =(const X&) = delete;
    X(X&&) = delete;
    X operator =(X&&) = delete;
};

X makeX() {return {};}

编译后

X&& x = makeX();

而以下不是

X x = makeX();

答案 1 :(得分:4)

模板非类型参数cannot refer to a temporary。因此,给定

struct X {};
X purr() { return {}; }

X x1 = purr();
X&& x2 = purr();

template<X&> class woof {};

我们有

woof<x1> w1; // OK
woof<x2> w2; // Error

如果...不限于X类型的prvalue,那么切片是一种不太模糊的方法,使两个非等价。给出:

struct X { virtual ~X() = default; };
struct Y : X {};

Y meow() { return {}; }

然后:

X x1 = meow();        // slices
X&& x2 = meow();      // doesn't slice

因此:

dynamic_cast<Y&>(x1); // throws std::bad_cast
dynamic_cast<Y&>(x2); // OK