为什么std :: basic_string :: operator []是一个const方法,如果它也是一个非const方法?

时间:2016-01-25 00:42:38

标签: c++ const std const-method

http://cplusplus.com/reference/string/basic_string/operator[]

我理解,有一个第二个版本返回const以防止在需要const结果时发出警告并缓解投射但是如果该函数已经提供了非const则是有利的方法(方法 - 不是结果)那么声明const - 结果方法const的重点是什么?

5 个答案:

答案 0 :(得分:4)

你需要明白,第二个(const)版本不仅返回不同的结果,而且还将自己标记为const(这是第二个{{ 1}}在声明的最后):

const

这是两个不同的事情:在非const_reference operator[] (size_type pos) const; 方法的存在下,不需要const返回值(因为非const返回值总是可以被转换为tò const版本。)

但没有const版本的运算符意味着您无法在const字符串对象上使用它。

const结果只是运算符本身const的结果:如果你有一个const字符串并使用运算符来获取对单个字符的引用,很明显,此引用也必须是const(如果不是,您可以更改const字符串中的单个字符。)

答案 1 :(得分:3)

假设你有

const std::string str{"test"};
std::cout << str[2];

如果您没有const成员函数,则上述代码将失败,因为隐式传递给this的{​​{1}}指针为operator[]

答案 2 :(得分:2)

如果您有def save_foto(self): """ Save foto data to a file """ self.data_aux = '' last = 0 self.data_list = list(self.vFOTO) for i in range(0,len(self.vFOTO)): if(self.vFOTO[i]=='\x90' and self.vFOTO[i+1]=='\x00' and self.vFOTO[i+2]=='\x00' and self.vFOTO[i+3]=='\x00' and self.vFOTO[i+4]=='\x00' and self.vFOTO[i+5]=='\x00' and self.vFOTO[i+6]=='\x00' and self.vFOTO[i+7]=='\x00' and self.vFOTO[i+8]=='\x00' and self.vFOTO[i+9]=='\x00'): aux1=''.join(map(chr,self.data_list[last:i])) self.data_aux = self.data_aux+aux1 i=i+10 last=i ,则无法调用(非常量)const std::basic_string,因为它确实没有标记为const。

答案 3 :(得分:1)

如果没有该函数的const版本,则无法在const实例上调用该函数。例如:

void func (const std::string &h)
{
    if (h[0] == "hello")
        ...
}

如果没有const operator[]的{​​{1}}版本,这将如何运作?

答案 4 :(得分:0)

const方法返回不同的类型,它返回const - 限定引用。这意味着如果使用const方法,则方法的结果为const - 限定(因此是“不可变的”)。非const - 限定方法返回一个常规引用​​,它是“可变的”。

您不能 const方法,否则您无法修改非const - 限定std::basic_string个对象中的单个字符。并且您不能const方法,否则您将无法在const - 有资格的std::basic_string个对象上调用该方法。< / p>