为什么即使对于 "copy on write" 的 const 成员函数也返回一个代理类?

Why return a proxy class even for const member function for "copy on write"?

本文关键字:返回 代理 一个 函数 成员 copy on const write 为什么      更新时间:2023-10-16

在更有效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,因此任何引用都无法转义。