应该std :: move drop constness?

odi*_*erd 25 c++ const move-semantics c++11

以下代码在MSVC2010上编译并运行,是吗?

const std::string s = "foo";
std::string s2(std::move(s));
Run Code Online (Sandbox Code Playgroud)

我可以看出为什么这可能不会破坏任何东西,因为如果我采用s的内部我必须知道没有人会使用它所以我不得不放弃const.然而,编译器在ROM(在嵌入式应用程序中)实现const对象的位置呢?那么此举会变成副本吗?或者MSVC应该给我一个错误?

seh*_*ehe 30

我想std::move(T const&)只是回归T const &&.这意味着,它实际上不会被移动(因为移动赋值运算符/构造函数与param类型不匹配).

所发生的是,构造函数T const&匹配lvalue(变量类型T const &&),因此,移动降级为副本.

  • @AndyProwl似乎每次我在这里问一些你在那里的答案:)你喜欢守护天使的书呆子形式;) (3认同)
  • @KerrekSB虽然没有临时性(引用不是对象).但是`std :: move(...)`是一个xvalue,`const&`可以绑定到xvalues. (2认同)

Pup*_*ppy 23

这没什么区别

const std::string f() { return "foo"; }
std::string s2 = f();
Run Code Online (Sandbox Code Playgroud)

这曾经是一次推荐的C++ 03,委员会在引入rvalue引用时没有破坏这段代码.它只是降级为副本.