static_cast int для ссылки на int? - PullRequest
0 голосов
/ 26 мая 2019

Разрешено ли:

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 ]

7 голосов
/ 26 мая 2019

static_cast int для ссылки на int? Разрешено ли

Да. Это разрешено.

Если это так, то в чем смысл этих бросков?

Приведение ссылки на lvalue того же типа в большинстве случаев бессмысленно, поскольку используемая переменная уже является lvalue. Однако это может повлиять на вычет decltype, как показано в примере Бена Фойгта . Приведение к ссылке на другой тип полезно, если вам нужно уменьшить ссылку на базу (что не относится к int).

Полезно приведение к ссылке на rvalue, поскольку оно меняет тип выражения на xvalue. Это позволяет перейти от переменных. Это на самом деле то, что делает std::move. Это, в частности, не имеет значения для int.

1 голос
/ 26 мая 2019
static_cast<int&>(x);

Ничего не делает, поскольку x уже имеет тип int& при использовании в выражении.

static_cast<int&&>(x);

Приводит x, значение l, к значению r,Это именно то, что std::move делает и T&& используется для реализации семантики перемещения.

std::swap использует std::move, потому что просто нет недостатка и возможного повышения производительности.Коры / назначения перемещения всегда должны быть по меньшей мере такими же эффективными, как и копии / назначения копирования.

...