C++ 使用具有默认移动向量的复合类的移动后POD部分

C++ 使用具有默认移动向量的复合类的移动后POD部分,c++,c++11,C++,C++11,假设我们有一个包含非POD和POD部分的类。移动构造函数和移动指定是默认的。该类实例的POD部分在移动后是否可以安全使用 #include <string> struct A { std::string s = "foo"; int i = 42; }; A a; A b = std::move(a); int j = a.i; //OK or UB? #包括 结构A{ std::string s=“foo”; int i=42; }; A A; A b=标准::移

假设我们有一个包含非POD和POD部分的类。移动构造函数和移动指定是默认的。该类实例的POD部分在移动后是否可以安全使用

#include <string>
struct A {
    std::string s = "foo";
    int i = 42;
};
A a;
A b = std::move(a);
int j = a.i; //OK or UB?
#包括
结构A{
std::string s=“foo”;
int i=42;
};
A A;
A b=标准::移动(A);
int j=a.i//好的还是UB?

是否保证按元素移动/复制(这样就可以了),或者一致性实现是否可以改变POD部件(例如,通过与默认构造对象交换)?

默认移动ctor仅对每个成员(和基础)进行移动

移动基元类型只是复制它

因此,这在这个层面上有很好的定义


但是,从语义上讲,这是一个错误:除了“有效”之外,您应该避免依赖从对象状态移动的详细信息。

好问题。但在搬家后,千万不要考虑实际使用任何东西。它违背了移动语义的全部目的。Iirc,原语类型保证被视为一个副本,因此应该定义这个特定的示例。