&& 声明的变量

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 是您应该移出的东西,但您的示例仅因为您无法移动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

【讨论】:

这很好。谢谢。

以上是关于&& 声明的变量的主要内容,如果未能解决你的问题,请参考以下文章

声明变量&定义变量

Java变量&&常量

连续声明的变量的内存地址顺序总是降序吗?

ES6 - let & const

var & let & const 的区别

JavaScriptvar&let&const