是否允许:
int x = 1;
int r1 = static_cast<int&>(x);
int r2 = static_cast<int&&>(x)
如果是,那么这些强制转换的含义是什么?
此代码产生了一个问题:
int x = 1;
int y = 2;
std::swap(x, y); // uses int temp = std::move(x);
答案 0 :(得分:7)
static_cast int要引用int吗? 可以
是的。允许。
如果是,那么这些强制转换的含义是什么?
强制转换为相同类型的左值引用几乎是没有意义的,因为它自己使用的变量已经是左值。但是,它可能会影响decltype推导,如Ben Voigt's example中所示。如果您需要向下转换对base的引用(与int
不相关),则强制转换为对另一种类型的引用很有用。
投射到右值引用很有用,因为它将表达式的类型更改为xvalue。这允许从变量移动。实际上,std::move
就是这样做的。但这与int
并没有什么区别。
答案 1 :(得分:1)
static_cast<int&>(x);
不做任何事情,因为在表达式中使用x
时已经是int&
类型。
static_cast<int&&>(x);
将左值x
转换为r值。这正是std::move
所做的,T&&
用于实现移动语义。
std::swap
使用std::move
是因为它没有任何缺点,而且可能不会提高性能。移动ctor / assignments的效率至少应与复制ctor / assignments一样。