std :: map的operator[]函数返回左值引用,即使地图本身是右值。
T& operator[]( const Key& key );
这导致未定义的行为用法,如this one。为什么左下角的左值和右值没有重载?是否有其他地图实现使用此类重载?
T& operator[]( const Key& key ) &;
T operator[]( const Key& key ) &&;
答案 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的标准。它可能不实用,但乍一看它看起来像一个不错的主意,因为它破坏的代码类型非常奇怪(可能应该被破坏)。