成员函数从r值对象返回l值引用

时间:2014-02-10 16:30:52

标签: c++ c++11

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

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

这导致未定义的行为用法,如this one。为什么左下角的左值和右值没有重载?是否有其他地图实现使用此类重载?

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

1 个答案:

答案 0 :(得分:1)

#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,如果我们做出你提出的改变,那就是非法的。

虽然上面的代码很愚蠢,但这是一个事实,你的更改可以破坏事物。

对{C} 11标准化后期添加的this的rvalue引用。在周期后期对标准容器进行可能的重大更改可能是一个坏主意。

我建议你提出一个建议,将上述变更纳入C ++ 1z的标准。它可能不实用,但乍一看它看起来像一个不错的主意,因为它破坏的代码类型非常奇怪(可能应该被破坏)。