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
版本。如果 vector
是 const
.
,则调用 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
您已声明方法 data
是 const
,这意味着 它不应尝试改变任何成员变量 。换句话说,const
函数中的所有成员变量都被视为 const
。在 const
方法的上下文中,变量被视为
std::vector<char> const data_;
因为 v
是一个非常量 vector
永远不会调用 const
版本。
据我所知,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
版本。如果 vector
是 const
.
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
您已声明方法 data
是 const
,这意味着 它不应尝试改变任何成员变量 。换句话说,const
函数中的所有成员变量都被视为 const
。在 const
方法的上下文中,变量被视为
std::vector<char> const data_;
因为 v
是一个非常量 vector
永远不会调用 const
版本。