25

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

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

我明白为什么这可能不会破坏任何东西,因为如果我采用 s 的内部结构,我必须知道没有人会使用它,所以我放弃 const 并不重要。但是,编译器在 ROM 中(在嵌入式应用程序中)在哪里实现 const 对象呢?此举会变成副本吗?还是 MSVC 应该给我一个错误?

4

2 回答 2

30

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

发生的情况是,构造函数采用T const&匹配lvalue变量typed T const &&),因此,移动降级为副本。

于 2013-02-21T13:35:26.347 回答
23

这与

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

这曾经是推荐的 C++03,并且委员会在引入右值引用时没有破坏此代码。它只是降级为副本。

于 2013-02-21T13:37:27.127 回答