来自 ISO/IEC 14882:2011(E) (C++11) 的第 17.6.4.9 节:
Each of the following applies to all arguments to functions defined in the C++ standard library, unless explicitly stated otherwise.
[snip]
— If a function argument binds to an rvalue reference parameter, the implementation may assume that this parameter is a unique reference to this argument.
此规范仅适用于标准库函数,但似乎右值引用的全部意义在于使这种假设成为可能。如果我有一个接受右值引用并将其传递给它的函数(通过临时或 std::move
),该实现是否可以合法地执行假定它是唯一的优化?如果没有,是否有任何实现会这样做?
最佳答案
该语言本身并不强制要求右值引用不能为任何其他对象起别名,这只是标准库函数的规定前提条件。因此,如果您所说的“实现”是指编译器,那么不会 - 编译器不会根据此要求执行任何优化,当然不会在您编写的代码中执行。
如果特定编译器具有某种允许代码传递别名信息的扩展,那么该先决条件使得标准库函数可以利用此类扩展。这种别名信息可能使编译器可以执行一些优化。
无论如何,该声明的主要后果是标准库实现在面对函数参数的不合理别名时不需要表现得合理。例如,如果你用
构造一对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])
即使必须重新分配 vector 也能正常工作。我想委员会认为实现检测右值别名是不现实的,并且有时必须只移动。
关于c++ - C++ 实现是否允许假定任何右值引用函数参数是唯一的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18027177/