如果 std::basic_string::operator[] 也是非 const 方法,为什么它是 const 方法?
Why is std::basic_string::operator[] a const method if it's also a non-const method?
http://cplusplus.com/reference/string/basic_string/operator[]
我知道拥有返回const
的第二个版本是有利的,以防止在需要const
结果时发出警告并减轻转换,但如果函数已经提供了非const
方法(方法 - 不是结果),那么声明const
-result方法const
有什么意义?
你需要明白,第二个(const
)版本不仅返回不同的结果,而且还将自身标记为const
(这是声明末尾的第二个const
):
const_reference operator[] (size_type pos) const;
这是两件不同的事情:在存在非const
方法的情况下,const
返回值本身是不需要的(因为非常量返回值总是可以在const
版本中强制转换)。
但是没有const
版本的运算符意味着你不能在const
字符串对象上使用它。
const
结果只是运算符本身const
性的结果:如果你有一个const
字符串并使用运算符获取对单个字符的引用,显然这个引用也必须const
(如果没有,你可以更改const
字符串中的单个字符)。
假设你有
const std::string str{"test"};
std::cout << str[2];
如果您没有 const
成员函数,则上面的代码将失败,因为隐式传递给operator[]
的this
指针const
。
如果你有一个const std::basic_string
你不能调用(non-const)std::basic_string::operator[]
,因为它是,嗯,没有标记的const。
如果没有函数的const
版本,则无法在const
实例上调用该函数。例如:
void func (const std::string &h)
{
if (h[0] == "hello")
...
}
如果没有const
版本的operator[]
,这将如何工作?
const
方法返回不同的类型,它返回一个const
限定的引用。这意味着如果使用const
方法,则该方法的结果是const
限定的(因此是"不可变的")。非 const
限定方法返回一个常规引用,该引用是"可变的"。
不能只使用 const
方法,否则不能修改非 const
限定std::basic_string
对象中的单个字符。而且不能只使用非const
方法,否则将无法在const
-qualifed std::basic_string
对象上调用该方法。
- 如何在声明为 const 的方法中更改类成员
- 具有参数 (const T *&) 或 (T * &) 或 (const T * const &) 或 (T * const &) 的方法
- 从 const 对象访问非 const 方法
- 为什么我可以调用一个从const方法更改成员的方法
- 使用新的c++返回值语法的Const方法
- MSVC使用constexpr-if从可变模板方法中的基本模板参数中吞下const
- const_cast const 方法中的"this"将"this"分配给外部变量?
- 初始化 const 成员的正确方法
- const 方法使用引用修改对象
- 从类方法返回 "const char*" 作为 std::string&
- 从"wcslen"替换到"strnlen_s"时,用"const char*"进行类型转换是正确的方法吗?
- 将const指针(EVP_MD)保存到变量中,以将其重新使用为类方法(HMAC)
- 为什么 constexpr 假设我的方法就是 const
- 正确的方法通过巨大的const对象的向量
- 使用静态方法初始化 const 类字段的做法是好是坏
- 为什么重写方法并将 const 添加到参数类型有效
- CPP主方法const声明
- 如何基于模板参数制作方法const
- 命名重载的getter方法:const和nonconst
- 声明Get方法const时出错