C++如何对这个“向量[0 ]=1进行重载解析”; 我知道,C++只在参数或函数对象参数的基础上有函数重载。但我发现向量有两个操作符[]。它将在以下代码中选择正确的功能: std::vector<int> v; v[0] = 1; // This will select the non-const version. return &v[0]; // This will select the const version.

C++如何对这个“向量[0 ]=1进行重载解析”; 我知道,C++只在参数或函数对象参数的基础上有函数重载。但我发现向量有两个操作符[]。它将在以下代码中选择正确的功能: std::vector<int> v; v[0] = 1; // This will select the non-const version. return &v[0]; // This will select the const version.,c++,standards,C++,Standards,---编辑1--- 我认为它会选择const版本,因为下面的cc文件不能用clang++编译,而g++有以下错误。不理解以下错误。有人能再解释一下吗 错误:无法用右值初始化“char*”类型的返回对象 类型 “常量值类型*”又名“常量字符*” 返回数据大小==0?NULL:&data_u0] 实际上,在这两种情况下,都会调用非常量版本。如果向量为const,则调用const版本的时间为 编辑 关于你的例子,基于你函数的签名 char* data() const 您已经声明了方法数据是const

---编辑1---

我认为它会选择const版本,因为下面的cc文件不能用clang++编译,而g++有以下错误。不理解以下错误。有人能再解释一下吗

错误:无法用右值初始化“char*”类型的返回对象 类型 “常量值类型*”又名“常量字符*” 返回数据大小==0?NULL:&data_u0]


实际上,在这两种情况下,都会调用非常量版本。如果向量为const,则调用const版本的时间为

编辑 关于你的例子,基于你函数的签名

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

std::vector<char> const data_;

因为v是一个非常量向量,所以从不调用常量版本。

两者都选择非常量版本。您认为&v[0]为什么选择常量版本?您的编辑使用常量版本,因为数据函数标记为常量。这是一个完全不同的问题,你一开始就应该这样问这个问题。@TartanLIama哦,我明白了。关于这一点,有没有参考标准?
std::vector<int> const v = {1,2,3};
int x = v[0];
v[0] = 5;   // nope can't call non-const version, this is trying to mutate a const variable
char* data() const
std::vector<char> const data_;