C++ 执行以下行时调用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是非常量的,第一个选项(非常量选项

根据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
    是非常量的,第一个选项(非常量选项)将被调用

    编译器将查找要调用的最正确的方法

    只能对常量对象调用
    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非常好。这里你们已经得到了构造好的引用,所以赋值是可以的。另外,将常量分配给非常量也不是问题,因为您可以创建常量的非常量副本

    “已构建引用”--我错过了这一部分。现在这个问题看起来很愚蠢。“已经构建了引用”——我错过了这一部分。现在这个问题看起来很愚蠢。“但是给引用对象指定一个右值是完全正确的。”——这就是我的困惑所在。谢谢。“但是给引用对象指定一个右值是非常好的。”——这就是我的困惑所在。谢谢