C++ 执行以下行时调用std::vector的运算符[]的哪一个变体,为什么?
根据std::vector的运算符[],它有两个变体C++ 执行以下行时调用std::vector的运算符[]的哪一个变体,为什么?,c++,c++11,stdvector,rvalue,lvalue,C++,C++11,Stdvector,Rvalue,Lvalue,根据std::vector的运算符[],它有两个变体 参考运算符[](大小\u类型n) const_参考运算符[](size_type n)const 当我们执行下面一行时,调用上面的哪个变量 std::vector<int> vlist; vlist[0] = 7; std::vector vlist; vlist[0]=7; 我的想法是,第一个变量不应该被调用,因为我将右值赋值给一个非常量左值引用,方法是int&x=7是非法的。因为vlist是非常量的,第一个选项(非常量选项
参考运算符[](大小\u类型n)代码>
const_参考运算符[](size_type n)const代码>
std::vector<int> vlist;
vlist[0] = 7;
std::vector vlist;
vlist[0]=7;
我的想法是,第一个变量不应该被调用,因为我将右值赋值给一个非常量左值引用,方法是
int&x=7
是非法的。因为vlist
是非常量的,第一个选项(非常量选项)将被调用
编译器将查找要调用的最正确的方法
只能对常量对象调用const
方法。如果您有一个非常量对象,则可以调用该对象的常量和非常量方法
如果一个方法同时存在常量和非常量实现,则将根据对象本身的常量调用正确的方法
您的
int&x=7
示例确实是非法的,但并非上述情况(vlist[0]=7
)。您是对的,不能声明对rvalue
的引用。但是将rvalue
分配给引用对象是非常好的。因为vlist
是非常量的,所以会调用第一个选项(非常量选项)
编译器将查找要调用的最正确的方法
只能对常量对象调用const
方法。如果您有一个非常量对象,则可以调用该对象的常量和非常量方法
如果一个方法同时存在常量和非常量实现,则将根据对象本身的常量调用正确的方法
您的
int&x=7
示例确实是非法的,但并非上述情况(vlist[0]=7
)。您是对的,不能声明对rvalue
的引用。但是,将一个右值
分配给一个引用对象是非常好的。调用第一个变量<代码>int&x=7代码>不合法,因为这是一个定义。但是int&x=y;x=7代码>非常好。这里你们已经得到了构造好的引用,所以赋值是可以的。另外,将常量分配给非常量也不是问题,因为您可以创建常量的非常量副本 调用第一个变体<代码>int&x=7代码>不合法,因为这是一个定义。但是int&x=y;x=7代码>非常好。这里你们已经得到了构造好的引用,所以赋值是可以的。另外,将常量分配给非常量也不是问题,因为您可以创建常量的非常量副本 “已构建引用”--我错过了这一部分。现在这个问题看起来很愚蠢。“已经构建了引用”——我错过了这一部分。现在这个问题看起来很愚蠢。“但是给引用对象指定一个右值是完全正确的。”——这就是我的困惑所在。谢谢。“但是给引用对象指定一个右值是非常好的。”——这就是我的困惑所在。谢谢