She*_*evy 5 c++ rvalue-reference
来自ISO/IEC 14882:2011(E)(C++ 11)的§17.6.4.9:
除非另有明确说明,否则以下各项适用于C++标准库中定义的函数的所有参数.
[snip]
- 如果函数参数绑定到右值引用参数,则实现可以假定此参数是对此参数的唯一引用.
该规范仅适用于标准库函数,但似乎rvalue引用的全部要点是这种假设是可能的.如果我有一个带rvalue引用的函数并将其传递给一个(通过临时或者std::move),那么实现是否可以合法地执行假设它是唯一的优化?如果没有,那么任何实现都是这样做的吗?
该语言本身并不要求rvalue引用不能为任何其他对象设置别名,这只是标准库函数的一个明确的先决条件.因此,如果"实现"是指编译器,那么不 - 编译器不会根据此要求执行任何优化,当然也不会在您编写的代码中执行.
如果特定编译器具有允许代码传递别名信息的某种扩展,那么该前提条件使得标准库函数可以利用这些扩展.这种别名信息可以使编译器执行某些优化.
在任何情况下,该语句的主要结果是标准库实现在面对函数参数的不合理混叠时不需要合理地行为.例如,如果你构造一对
std::vector<int> some_vector(100, 42);
auto p = std::make_pair(std::move(some_vector), some_vector);
Run Code Online (Sandbox Code Playgroud)
不能保证p.first == p.second.
对于左值参考参数缺少这样的要求意味着标准库必须做一些疯狂的事情,以确保vector.insert(vector.end(), vector[3])即使必须重新分配向量,代码仍然有效.我想委员会认为检测右值混叠的实现是不现实的,并且有时可能只能移动.