C++ 容器上的移动分配:以前包含的对象的状态

C++ 容器上的移动分配:以前包含的对象的状态,c++,stl,move-semantics,C++,Stl,Move Semantics,由于(事实上,前者是更好的参考),我在标准中找不到合适的参考,除了20.5.5.15: C++中定义的类型对象可以从(15.8)移动。可以显式指定或隐式生成移动操作。除非另有规定,否则从物体上移动的物体应处于有效但未指定的状态 对目标容器中先前包含的元素是否有任何要求,例如:。G在任务开始前被摧毁 例如: std::list<SomeClass> v1({10, 12}); std::list<SomeClass> v2({7}); v1 = std::move(v2)

由于(事实上,前者是更好的参考),我在标准中找不到合适的参考,除了20.5.5.15:

<> C++中定义的类型对象可以从(15.8)移动。可以显式指定或隐式生成移动操作。除非另有规定,否则从物体上移动的物体应处于有效但未指定的状态

对目标容器中先前包含的元素是否有任何要求,例如:。G在任务开始前被摧毁

例如:

std::list<SomeClass> v1({10, 12});
std::list<SomeClass> v2({7});
v1 = std::move(v2);
for(auto sc : v2)
{
    std::cout << sc << ' ';
}
std::list v1({10,12});
std::list v2({7});
v1=标准::移动(v2);
用于(自动sc:v2)
{
std::coutIn,我们看到

a
的所有现有元素要么被指定移动,要么被销毁。 确保:
a
应等于
rv
在此之前的值 任务

其中,
a
是目的地,
rv
是右值。这可以通过将1与源目的地的元素交换来实现,但很可能是通过调整大小然后移动来实现

  • 必须通过非专业的
    \uuuu交换
    ,以确保移动任务确实发生

  • 我不知道您是在询问从moved from容器开始的元素,还是从moved to容器开始的元素container@Caleth那些在移动到。嗯,但那些在移动从也变得有趣(可能会得到一个单独的问题):如果它们不提供移动语义,那么仍然通过交换容器内容来移动它们合法吗?在您的示例中,所有的“,”10 12“,”7”都是可能的输出,以及
    MyClass
    值的每一个其他序列(但我不希望任何实现发出任何其他序列)@Aconcagua但是你在你的例子中没有对moved to对象做任何事情。你从
    v2
    移动并检查
    v2
    …你问moved是否可以作为交换实现,并且作为一个例子是合法的吗?@luk32完全正确……我感兴趣的是在移动之前
    v1
    中的那些元素会发生什么,特别是如果是这样的话之后将它们留在
    v2
    中是合法的。嗯,假设a的元素比rv多,那么只有在元素的析构函数没有副作用的情况下(但我们必须调整v2的大小),交换才是有效的?如果它有并且我们交换了,我们就必须为剩余的元素调用析构函数(因此,在我上面的示例中,输出
    10 12
    是不合法的,因为第二个对象必须被销毁,但是
    10
    是合法的,前提是从移动的对象在被移动时接收到这个值。同样,我们必须确保对于那些未被销毁的元素,move-ctor也会产生任何副作用。您认为呢同意吗?顺便说一下,这一段是不完整的:
    rv
    中的多余元素会发生什么情况?我假设现在它们需要在
    a
    中移动构造,但标准没有明确说明。或者这是在其他地方说明的?@Aconcagua
    rv
    是从标准库中移动的对象。它将在“有效但未指明的国家"关于移动的副作用,所有这些可能的行为都可以基于@Aconcagua
    a
    必须增加大小,如果
    rv
    更大,等于
    rv
    的旧值。新元素可能是移动构造的。不确定我是否应该感到受到侮辱…当然
    a
    必须增加。Point是:标准没有明确说明move构造,因此似乎存在差距。