gpt4 book ai didi

c++ - 编译器在 VC12 (VS2013) 中生成 move 构造函数行为

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:20 24 4
gpt4 key购买 nike

<分区>

我试图测试编译器为具有数据成员“std::string”和“std::shared_ptr”的类生成 Move Constructor 的行为。

class Record
{
public:

Record():mData("defRec"), mDataPtr(new std::string("defRec"))
{}

Record(const std::string &str): mData(str), mDataPtr(new std::string(str))
{}

private:

std::string mData;
std::shared_ptr<std::string> mDataPtr;
};

任何 D'tor、 move 和复制操作都被故意省略,以允许编译器生成 move 操作。类数据成员已被特别选择,因为与 Record 类不同,它们都定义了 D'tor、 move 和复制操作。

在下面的代码之后,

Record rec1(std::string("Record1"));
Record rec2(std::move(rec1));

检查对象 rec1(通过调试器或通过定义访问方法)时,mData 仍然包含“Record1”并且 mDataPtr 仍然包含字符串指针。

但是,如果我提供自己的 Move Constructor,如下所示

Record(Record&& rhs) : mData(std::move(rhs.mData)), mDataPtr(std::move(rhs.mDataPtr))
{}

然后在下面的代码之后

Record rec1(std::string("Record1"));
Record rec2(std::move(rec1));

检查对象 rec1 时,mData 和 mDataPtr 都变成空对象。

我不明白为什么编译器为“类 Record”生成的 move 构造函数会给出与我的“类记录” move 构造函数版本不同的结果,我只是确保调用数据成员的 move C'tor。我希望编译器生成的 move 构造函数具有相同的行为吗?

虽然 moved from 对象应该处于有效状态,但数据成员的 move 构造函数(两次都不是我定义的)给出了不同的结果。

这是 VC12 (VS2013) 的已知限制吗?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com