C++ 如何为此 "vector[0] = 1;" 进行重载解析

How C++ do overload resolution for this "vector[0] = 1;"

据我所知,C++只有基于参数或隐含对象参数的函数重载。但我发现向量有两个运算符[]。它将 select 以下代码中的正确功能:

std::vector<int> v;
v[0] = 1; // This will select the non-const version.
return &v[0]; // This will select the const version.

谁能解释这是怎么发生的?

      reference operator[] (size_type n);
const_reference operator[] (size_type n) const;

------编辑 1------

我认为它会 select const 版本,因为以下 cc 文件无法用 clang++ 和 g++ 编译并出现以下错误。不明白以下错误。谁能解释更多?

error: cannot initialize return object of type 'char *' with an rvalue of type 'const value_type *' (aka 'const char *') return data_.size() == 0 ? NULL : (&data_[0]);

#include <assert.h>

#include <deque>
#include <vector>
#include <map>


class X
{
public:

    X() {
    }

    virtual ~X() {
    }

    char* data() const {
        return data_.size() == 0 ? NULL : (&data_[0]);
    }

    size_t size() const {
        return data_.size();
    }


private:
    std::vector<char> data_;
};

实际上在这两种情况下都调用了非const 版本。如果 vectorconst.

,则调用 const 版本的时间
std::vector<int> const v = {1,2,3};
int x = v[0];

在上述情况下,尝试调用非const 版本会导致编译器错误

v[0] = 5;   // nope can't call non-const version, this is trying to mutate a const variable

编辑
关于您的示例,基于您函数的签名

char* data() const

您已声明方法 dataconst,这意味着 它不应尝试改变任何成员变量 。换句话说,const 函数中的所有成员变量都被视为 const。在 const 方法的上下文中,变量被视为

std::vector<char> const data_;

因为 v 是一个非常量 vector 永远不会调用 const 版本。