执行以下行时会调用 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 个变体
reference operator[] (size_type n);
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 的非常量副本;
根据 C++ Reference std::vector 的 Operator[] 有 2 个变体
reference operator[] (size_type n);
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 的非常量副本;