在更有效C++中,给出了以下代码
const String::CharProxy String::operator[] (int index) const
{
return CharProxy(const_cast<String&>(*this), index);
}
String::CharProxy::operator char() const
{
return theString.value->data[charIndex];
}
为什么我们不只返回一个 char 而不是使用 const_cast 并在以后将 CharProxy 转换为 char?
如果我在你的情况下没有错,还有非常量版本既可以读/写字符,也可以像 Real Fresh 所说的那样获取字符的指针/参考。
然后很自然地为允许读取字符(当然不是写入)的 const 版本提供相同的内容,并且还获取字符的指针/引用(const)。
你有这种行为与 std::vector std::string 等
你这样做是为了String::const_reference
(即 const String::CharProxy
) 绑定到[]
的返回值不会在其他地方修改该特定String
时突然变得悬而未决。
你可以定义突变使所有引用无效,但这意味着你的String
类将无法用于各种泛型代码,并且是"远距离的幽灵动作"。 例如,你有代码 A 首先从String
中获取可变引用,然后代码 B 获取常量引用,然后 A 通过它的引用发生变异。现在代码 B 的引用已失效,它无法事先检查是否会发生这种情况。
请注意,代理按值返回char
,因此任何引用都无法转义。