c++ - 从右值对象返回左值引用的成员函数

标签 c++ c++11

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++ - 从右值对象返回左值引用的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21682669/

相关文章:

c++ - 带有派生类的 std::unique_ptr

c++ - SIGSEGV;丢失文件;使用 sscanf 运行程序时

c++ - condition_variable.notify 是同步点吗?

multithreading - C++原子内存顺序与线程事件,例如notify()

c++ - 标签调度相对于正常重载解析的优势

c++ - 字符串指针语法,这是正确的吗?

c++ - 在 Opengl 中用球体绘制椭圆

c++ - 当我直接解析 Mat 时,未检测到 OpenCv Aruco 标记

c++ - 为什么 set/map emplace_hint 不返回 bool 值

lambdas 的 C++ vector - undefined reference