在移动施工过程中,从物体移动的基本型成员的价值可以说什么?

Mat*_*ias 8 c++ language-lawyer move-semantics c++11

考虑这段代码

Foo f1;
Foo f2{ std::move(f1) };
Run Code Online (Sandbox Code Playgroud)

我希望成员值f1不再必须保持默认构造函数给出的值.但是,使用此实现进行多个编译器的测试Foo表明不然.

class Foo
{
public:
    Foo() = default;
    Foo(Foo &&) = default;

    std::string s{ "foo" };
    bool t{ true };
    bool f{ false };
};
Run Code Online (Sandbox Code Playgroud)

移动f1.t总是true并且f1.f永远是false.正如在这个问题中所描述的那样,我希望这些值要么是不确定的,要么两个布尔值都具有相同的值.但是,它们似乎获得了与默认构造函数相同的值.

GCC的实例

这只是我的编译器的实现细节(巧合相同)还是在标准中?

Bar*_*rry 11

移动f1.t总是true并且f1.f永远是false.

对于基本类型,移动就是复制.你不会希望你的实现复制的布尔零出旧的-这是不必要的额外工作.在一个简单的POD中,移动只是一个memcpy- 但如果你的建议会发生,你也必须做一个memset.什么都不做就快得多.

这只是我的编译器的实现细节(巧合相同)还是在标准中?

这是[class.copy]中的标准:

对于非工会类X的隐式定义的复制/移动赋值运算符执行按成员及其子对象的禁止复制/移动分配.[...]每个子对象都以适合其类型的方式分配:
- [...]
- 如果子对象是标量类型,则使用内置赋值运算符.