标准库对自动分配有什么保证?

C ++ 11标准对于标准库的自动分配有什么意义? 更具体一些,如果有的话,什么是selfAssign保证什么?

 template<class T> std::vector<T> selfAssign(std::vector<T> v) { v = std::move(v); return v; } 

17.6.4.9函数参数[res.on.arguments]

1除非另有明确规定,否则以下各项适用于在C ++标准库中定义的函数的所有参数。

  • 如果函数参数绑定到右值引用参数,则实现可能会假定此参数是对此参数的唯一引用。 [注意:如果参数是T &&forms的generics参数,并且typesA的左值被绑定,则参数绑定到左值引用(14.8.2.1),因此不在前面的句子中。 – 注意:如果一个程序将一个左值传递给一个xvalue,同时将该左值传递给一个库函数(例如通过用参数move(x)调用该函数),程序会有效地要求该函数处理该左值作为一个临时的。 这个实现可以自由地优化掉参数是否有价值时可能需要的别名检查。 -endnote]

所以,允许std::vector<T, A>::operator=(vector&& other)的实现假设other是一个prvalue。 如果other是一个prvalue,自动分配是不可能的。

什么可能发生:

v将处于无资源状态(0容量)。 如果v已经有0容量,那么这将是一个无操作。

更新

最新的工作草案N4618经过修改,明确指出在移动可MoveAssignable要求中,

 t = rv 

(其中rv是右值),如果trv不引用相同的对象, t只需要是赋值之前的rv的等价值。 而且,无论在任务之后, rv的状态都是未指定的。 有一个额外的说明进一步澄清:

rv必须仍然符合使用它的库组件的要求,无论trv是否指向同一个对象。

什么也不会发生。 如果&other == this一个聪明的赋值操作符可能会立即返回。 否则,它将把内部分配给自己,什么都不做。