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