&& 声明的变量
Posted
技术标签:
【中文标题】&& 声明的变量【英文标题】:Variables declared by && 【发布时间】:2015-12-27 10:24:27 【问题描述】:想到 (x|r|l|pr|gl) 值,我想到了以下问题:
考虑以下两个变量声明:
X x = ...;
和
X&& x = ...;
并假设 ...
确实不提供 xvalue。
谁能想到使用decltype
的代码不会有所不同?在这两种情况下,(x)
都将是 X
类型的左值,不是吗?
【问题讨论】:
我的意思是使用如此声明的变量的区别。 【参考方案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
是您应该移出的东西,但您的示例仅因为您无法移动X
s而起作用。【参考方案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
【讨论】:
这很好。谢谢。以上是关于&& 声明的变量的主要内容,如果未能解决你的问题,请参考以下文章