标准库对自动分配有什么保证?
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
是右值),如果t
和rv
不引用相同的对象, t
只需要是赋值之前的rv
的等价值。 而且,无论在任务之后, rv
的状态都是未指定的。 有一个额外的说明进一步澄清:
rv
必须仍然符合使用它的库组件的要求,无论t
和rv
是否指向同一个对象。
什么也不会发生。 如果&other == this
一个聪明的赋值操作符可能会立即返回。 否则,它将把内部分配给自己,什么都不做。