首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么继续移动const对象工作?

为什么继续移动const对象工作?
EN

Stack Overflow用户
提问于 2014-05-28 10:35:00
回答 1查看 231关注 0票数 7

我有一个简单的代码:

代码语言:javascript
复制
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对象,那么代码是如何编译的呢?!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-28 10:37:53

你是不是在动什么东西

std::move的名称非常糟糕:它不强制移动;它只是返回一个rvalue。这取决于编译器来决定要调用哪个std::vector<int>构造函数,而这正是决定您是否得到移动的原因。

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

代码语言:javascript
复制
#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;
}

(live demo)

它是这样设计的(const T&&能够绑定到const T&),至少部分原因是移动是为了最大的努力,因此在这种情况下,您不必与编译器错误作斗争。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23909242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档