【问题标题】:Why is std::basic_string::operator[] a const method if it's also a non-const method?如果 std::basic_string::operator[] 也是非常量方法,为什么它是 const 方法?
【发布时间】:2016-05-01 05:22:10
【问题描述】:

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

我知道有第二个版本返回 const 以防止在需要 const 结果时发出警告并减轻强制转换但如果函数已经提供非const 方法(方法--不是结果)那么声明const-result 方法const 的意义何在?

【问题讨论】:

    标签: c++ constants std const-method


    【解决方案1】:

    您需要了解,第二个 (const) 版本不仅返回不同的结果,而且还标记为const(这是最后的第二个const声明):

    const_reference operator[] (size_type pos) const;
    

    这是两个不同的东西:const 返回值本身在非const 方法存在的情况下不需要(因为非常量返回值总是可以转换为const 版本)。

    但没有const-version 运算符意味着您不能在const 字符串对象上使用它。

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

    【讨论】:

    • 当然可以!它指的是对象本身是 const。这允许对const 或非const 相同类型的对象进行过滤。这是我缺少的线索。用 Java 编程有一段时间了,我忘记了这是我们处理不可变类型的方式,而不必为同一对象创建重复的“不可变”类。
    【解决方案2】:

    假设你有

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

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

    【讨论】:

      【解决方案3】:

      如果您有 const std::basic_string,则不能调用(非 const)std::basic_string::operator[],因为它没有标记为 const。

      【讨论】:

        【解决方案4】:

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

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

        如果没有operator[]const 版本,这将如何工作?

        【讨论】:

        • 我不是反对者,但可能是错字或有人认为它不完整 (if (h[0] ==)?
        【解决方案5】:

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

        您不能使用const 方法,否则您无法修改非const 限定的std::basic_string 对象中的单个字符。而且您不能拥有非const 方法,否则您将无法在const-qualifed std::basic_string 对象上调用该方法。

        【讨论】:

          猜你喜欢
          • 2016-03-15
          • 2020-01-31
          • 2015-04-02
          • 2016-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多