Подтвердить что ты не робот

Должен ли std:: move drop constness?

Следующий код компилируется и запускается на MSVC2010, должен ли он?

const std::string s = "foo";
std::string s2(std::move(s));

Я могу понять, почему это, вероятно, ничего не сломает, поскольку, если я возьму внутренние элементы, я должен знать, что никто не будет использовать его, поэтому не важно, что я бросаю const. Однако как насчет того, где компилятор реализует объекты const в ROM (во встроенном приложении)? Будет ли переход превращаться в копию? Или MSVC должен дать мне ошибку?

4b9b3361

Ответ 1

Я думаю, что std::move(T const&) просто возвращает T const &&. Это означает, что на самом деле он фактически не будет перемещен из (поскольку операторы присваивания/конструкторы перемещения не соответствуют типу параметра).

Случается, что конструктор, принимающий T const&, соответствует lvalue (переменная, набранная T const &&), и как таковая, это движение деградирует в копию.

Ответ 2

Это не имеет значения для

const std::string f() { return "foo"; }
std::string s2 = f();

Это было когда-то рекомендовано С++ 03, и Комитет не нарушил этот код при вводе ссылок rvalue. Он просто деградирует в копию.