考虑(x | r | l | pr | gl)值,我想到了以下问题:
考虑以下两个变量声明:
X x = ...;
和
X&& x = ...;
并假设...
执行而非提供xvalue。
任何人都可以使用decltype
来解释代码而不是吗?在这两种情况下,(x)
都会使用X
类型的左值,不是吗?
答案 0 :(得分:6)
也许是人为的例子,但是用
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();
答案 1 :(得分:4)
模板非类型参数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
类型的prvalue,那么切片是一种不太模糊的方法,使两个非等价。给出:
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