考虑到(x | r | l | pr | gl)值,我想到了以下问题:
考虑以下两个变量声明:
X x = ...;
和
X&& x = ...;
并假设 ...
做 不 提供xvalue。
任何人都可以想到代码 不 运用 decltype
这有什么不同?在这两种情况下, (x)
将通过类型的左值 X
,不是吗?
考虑到(x | r | l | pr | gl)值,我想到了以下问题:
考虑以下两个变量声明:
X x = ...;
和
X&& x = ...;
并假设 ...
做 不 提供xvalue。
任何人都可以想到代码 不 运用 decltype
这有什么不同?在这两种情况下, (x)
将通过类型的左值 X
,不是吗?
模板非类型参数 不能指临时的。因此,给定
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
也许人为的例子,但有
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();