【问题标题】:Variables declared by &&&& 声明的变量
【发布时间】:2015-12-27 10:24:27
【问题描述】:

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

考虑以下两个变量声明:

X x = ...;

X&& x = ...;

并假设 ... 确实提供 xvalue。

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

【问题讨论】:

  • 我的意思是使用如此声明的变量的区别。

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


【解决方案1】:

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

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

【讨论】:

  • const 参考也可以,如果您不介意 constness。
  • 感谢您的回答和 cmets。我没有意识到这一点,所以我学到了一些东西。然而,我的问题更多地针对使用变量的代码。
  • 评论:这有点奇怪。 && 似乎表明 x 是您应该移出的东西,但您的示例仅因为您无法移动Xs而起作用。
【解决方案2】:

模板非类型参数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

【讨论】:

  • 这很好。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 2014-11-09
相关资源
最近更新 更多