首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隐式移动方法总是保留基本数据吗?

隐式移动方法总是保留基本数据吗?
EN

Stack Overflow用户
提问于 2016-09-26 21:47:15
回答 2查看 82关注 0票数 1

我的理解是,当一个基本数据类型被移出时,它总是会执行一次复制。

例如,您永远不能从int中移动,并且不能指定原始int值:

代码语言:javascript
复制
#include <iostream>

int main() {

    int x = 100;
    int y{std::move(x)};
    std::cout << x << " " << y; //always prints "100 100"

}

这是否意味着用户定义类型中的基本数据类型也是如此?

代码语言:javascript
复制
#include <iostream>
#include <vector>

struct Foo{
    int i = 100;
    std::vector<int> vec={1,2,3,4,5}; //something that probably will have an invariant
};

int main() {

    Foo x;
    Foo y{std::move(x)};
    std::cout << x.i << " " << y.i; //always print "100 100"?

}

关于在移动后保留这些基本类型值,标准是怎么说的?

EN

回答 2

Stack Overflow用户

发布于 2016-09-26 22:11:14

编译器生成的特殊成员函数被指定为基本上对类的每个成员(和基类)执行相应的操作。

所以你的struct Fooi将会表现得像一个被移动的int --从vector的.同上。

票数 3
EN

Stack Overflow用户

发布于 2016-09-26 22:01:42

这取决于数据成员的移动构造函数。例如,std::vector的move构造函数通常会将向量留空,但正如您所说,状态是未指定的。

int的状态不会改变,因为它们是可以构造的。编译器将对简单移动的可构造类型执行复制。正如@T.C.在评论中所述,此行为是标准所要求的。

如果您打算在将类移出后使用它,请考虑实现您自己的移动构造函数:

代码语言:javascript
复制
struct Foo {
    int i = 100;
    std::vector<int> vec={1,2,3,4,5};

    Foo(Foo&& foo) noexcept : i{std::move(foo.i)}, vec{std::move(foo.vec)} {
        foo.vec = {}; // ensure it's empty
        foo.i = 0; // ensure it's 0
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39704648

复制
相关文章

相似问题

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