&& 声明的变量

Variables declared by &&

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

考虑以下两个变量声明:

X x = ...;

X&& x = ...;

并假设 ... 传递一个 xvalue。

有人能想到使用 decltype 的代码 而不是 会有所不同吗?在这两种情况下,(x) 将通过类型 X 的左值,不是吗?

也许是人为的例子,但是

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();

模板非类型参数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 类型的纯右值,则切片是一种使两者不等价的不太晦涩的方法。给定:

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