&& 声明的变量
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
考虑 (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