http://cplusplus.com/reference/string/basic_string/operator[]
我理解,有一个第二个版本返回const
以防止在需要const
结果时发出警告并缓解投射但是如果该函数已经提供了非const
则是有利的方法(方法 - 不是结果)那么声明const
- 结果方法const
的重点是什么?
答案 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>