问题 &&声明的变量


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

考虑以下两个变量声明:

X x = ...;

X&& x = ...;

并假设 ... 做  提供xvalue。

任何人都可以想到代码  运用 decltype 这有什么不同?在这两种情况下, (x) 将通过类型的左值 X,不是吗?


8773
2017-12-27 10:24


起源

我的意思是使用如此声明的变量的差异。 - JohnB


答案:


模板非类型参数 不能指临时的。因此,给定

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

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

template<X&> class woof {};

我们有

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

如果 ... 不仅限于类型的prvalue 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

4
2017-12-27 14:53



这是非常好的。谢谢。 - JohnB


也许人为的例子,但有

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

6
2017-12-27 10:35



const 如果你不介意常量,那么引用也会起作用。 - Revolver_Ocelot
谢谢你的回答和评论。我没有意识到这一点,所以我学到了一些东西。然而,我的问题是使用变量更多地针对代码。 - JohnB
评论:这有点奇怪。 &&似乎暗示了这一点 x 是你应该移动的东西,但你的榜样只是因为你的事实 不能 移动 X秒。 - JohnB