5

来自 ISO/IEC 14882:2011(E) (C++11) 的第 17.6.4.9 节:

以下每一项都适用于 C++ 标准库中定义的函数的所有参数,除非另有明确说明。
[snip]
— 如果函数参数绑定到右值引用参数,则实现可能假定此参数是对此参数的唯一引用。

该规范仅适用于标准库函数,但似乎右值引用的全部意义在于使这种假设成为可能。如果我有一个接受右值引用并将其传递给它的函数(通过临时或std::move),那么实现是否可以合法地执行假设它是唯一的优化?如果没有,是否有任何实现这样做?

4

1 回答 1

5

该语言本身并不要求右值引用不能为任何其他对象起别名,这只是标准库函数的一个声明的先决条件。因此,如果“实现”是指编译器,那么不 - 编译器不会根据此要求执行任何优化,当然不会在您编写的代码中执行。

如果一个特定的编译器有某种扩展允许代码传递别名信息,那么这个前置条件使得标准库函数可以利用这些扩展。这种别名信息可能使编译器可以执行一些优化。

无论如何,该声明的主要后果是标准库实现不需要在面对函数参数的不合理别名时表现得合理。例如,如果您构造一对

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])即使向量必须重新分配也能正常工作。我想委员会认为检测右值别名的实现是不现实的,并且有时可能只移动。

于 2013-08-02T23:06:32.800 回答