Это может быть очевидно, но я думаю, что это что-то трудное для меня. Учитывая это:
void test(std::string&&) { }
std::string x{"test"};
test(std::move(x)); // ok
Этот код вызывает test()
со ссылкой на rvalue в качестве параметра, поэтому программа компилируется, как я ожидал.
Теперь посмотрите на это:
void other_test(const std::string&) { }
std::string x{"test"};
other_test(std::move(x)); // ok???
И вот я наклонился. Почему эта версия компилируется? std::move
возвращает тип &&; почему тогда я не получаю ошибку во втором методе, где я использую const&
?
Я знаю, что
int&& s = 5;
const int& s = 5;
действительно, потому что в обоих случаях я предоставляю что-то, что не имеет lvalue, у него нет адресов. * &&
и const&
эквивалентны? Если нет, есть ли различия?