为什么继续使用const对象呢?

Why move on const objects work?

本文关键字:对象 const 继续 为什么      更新时间:2023-10-16

我有一个简单的代码:

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对象,那么代码是如何编译的?

没有移动任何东西。

std::move的名字真的很糟糕:它没有强制移动;它只是返回一个右值。由编译器决定调用std::vector<int>的哪个构造函数,而决定您是否得到移动。

如果由于目标对象的move构造函数不匹配而无法移动容器,则根据基本的重载规则使用复制构造函数。

#include <iostream>
struct T
{
    T() = default;
    T(const T&) { std::cout << "copy ctorn"; }
    T(T&&)      { std::cout << "move ctorn"; }
};
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&)至少部分是因为移动的目的是最好的努力,正是这样你不得不与编译器错误作斗争,在这种情况下