Должен ли std:: move drop constness?
Следующий код компилируется и запускается на MSVC2010, должен ли он?
const std::string s = "foo";
std::string s2(std::move(s));
Я могу понять, почему это, вероятно, ничего не сломает, поскольку, если я возьму внутренние элементы, я должен знать, что никто не будет использовать его, поэтому не важно, что я бросаю const. Однако как насчет того, где компилятор реализует объекты const в ROM (во встроенном приложении)? Будет ли переход превращаться в копию? Или MSVC должен дать мне ошибку?
Ответы
Ответ 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. Он просто деградирует в копию.