我有一个简单的代码:
const std::vector<int> data = {1,2,3};
std::vector<int> data_moved=std::move(data);
for(auto& i:data)
cout<<i;//output is 123它编译时没有任何错误或警告!!
而且data似乎仍然有它的价值!
移动const值似乎不正确,因为我们不能修改const对象,那么代码是如何编译的呢?!
发布于 2014-05-28 10:37:53
你是不是在动什么东西
std::move的名称非常糟糕:它不强制移动;它只是返回一个rvalue。这取决于编译器来决定要调用哪个std::vector<int>构造函数,而这正是决定您是否得到移动的原因。
如果由于目标的移动构造函数不匹配而无法移动容器,则将通过基本重载规则使用复制构造函数。
#include <iostream>
struct T
{
T() = default;
T(const T&) { std::cout << "copy ctor\n"; }
T(T&&) { std::cout << "move ctor\n"; }
};
int main()
{
T a;
T b = std::move(a); // "move ctor"
const T c;
T d = std::move(c); // "copy ctor" - `const T&&` only matches copy ctor
// (shut up GCC)
(void) b;
(void) d;
}它是这样设计的(const T&&能够绑定到const T&),至少部分原因是移动是为了最大的努力,因此在这种情况下,您不必与编译器错误作斗争。
https://stackoverflow.com/questions/23909242
复制相似问题