即使 map 本身是右值,std::map的operator[]函数也会返回左值引用。

T& operator[]( const Key& key );

这将导致未定义的行为用法,例如this one。为什么左值和右值没有重载,如下所示?是否有任何其他 map 实现使用此类重载?
T& operator[]( const Key& key ) &;
T operator[]( const Key& key ) &&;

最佳答案

#include <iostream>
#include <map>

bool silly_test( int& lhs, int& rhs ) { return lhs == rhs; }
std::map<int, int> silly_map() {
  std::map<int, int> retval;
  retval[0] = 0;
  return retval;
}

int main() {
  std::cout << silly_test( silly_map()[0], silly_map()[0] ) << "\n";
}

上面的代码是合法的C++ 03,如果我们进行了您建议的更改,则该代码是非法的。

虽然上面的代码很愚蠢,但这是您所做的更改可能会破坏事情的一个示例。

this的右值引用在C++ 11标准化的后期添加。在周期的后期对标准容器进行可能潜在的更改更改可能不是一个好主意。

我鼓励您提出一项建议,以将上述更改变为C++ 1z的标准。这可能不切实际,但是乍一看它似乎是一个不错的主意,因为它所破坏的代码种类非常奇怪(并且可能应该被破坏)。

关于c++ - 成员函数从r值对象返回l值引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21682669/

10-12 20:43