执行以下行时会调用 std::vector 的 operator [] 的哪个变体,为什么?

Which variant of operator [] of std::vector gets called when the following line is executed and why?

根据 C++ Reference std::vector 的 Operator[] 有 2 个变体

  1. reference operator[] (size_type n);
  2. const_reference operator[] (size_type n) const;

当我们执行以下行时,上面的哪个变体被调用了?

std::vector<int> vlist;
vlist[0] = 7;

我的想法是,不应该调用第一个变体,因为我正在将右值分配给非常量左值引用,这种方式 int& x = 7; 是非法的。

因为 vlist 是非常量,第一个选项(非常量)将被调用。

编译器寻找最正确的方法来调用。

只能在 const 对象上调用 const 方法。如果您有一个非常量对象,则可以调用该对象的常量和非常量方法。

如果一个方法同时存在 const 和非 const 实现,将调用正确的方法,具体取决于对象本身的常量性。

您的 int& x = 7 示例确实是非法的,但并非上述情况 (vlist[0] = 7)。你是对的,不能声明对 rvalue 的引用。但是将 rvalue 分配给引用对象是完全没问题的。

调用了第一个变体。 int &x = 7; 不合法,因为这是一个定义。但是 int &x = y; x = 7; 完全没问题。在这里你得到了已经构建的引用,所以赋值是可以的。将 const 分配给非常量也不是问题,因为您可以创建 const 的非常量副本;