static_cast int要引用int吗?

时间:2019-05-26 12:45:00

标签: c++ c++11 rvalue-reference static-cast

是否允许:

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);

2 个答案:

答案 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一样。