Effective C++,第三版:重载const函数

mki*_*ner 0 c++ const

我正在尝试使用"Effective C++,Third edition"一书来学习一些C++编码的最佳实践.

在第3项中,作者谈到了const成员职能.它们给出了一个示例类,它们将[]操作符重载两次 - 一次用于非const,一次用于const对象.给出以下代码:

class TextBlock {
public:
 ...
 const char&                                       // operator[] for
 operator[](const std::size_t position) const      // const objects
 { return text[position]; }
 char&                                             // operator[] for
 operator[](const std::size_t position) const      // non-const objects
 { return text[position]; }
private:
   std::string text;
};
Run Code Online (Sandbox Code Playgroud)
TextBlock tb("Hello");
std::cout << tb[0];                   // calls non-const
                                      // TextBlock::operator[]
const TextBlock ctb("World");
std::cout << ctb[0];                  // calls const TextBlock::operator[]
Run Code Online (Sandbox Code Playgroud)

所以我试图实现这个片段只是为了得到一些练习.

#include <iostream>
#include <string>

class text_block
{
    public:
        text_block(const std::string& s);
        const char& operator[](const std::size_t position) const;
        char& operator[](const std::size_t position) const;
    private:
        std::string s;
};

text_block::text_block(const std::string& s) : s(s) {}

const char& text_block::operator[](const std::size_t position) const
{
    return s[position];
}

char& text_block::operator[](const std::size_t position) const
{
    return s[position];
}

int main()
{
    text_block tb("non-const");
    const text_block ctb("const");

    std::cout << tb[0] << std::endl << ctb[0] << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,g++ 6.1.1给我几个错误,例如error: ‘char& text_block::operator[](std::size_t) const’ cannot be overloaded.

正如我理解本书的解释,[]运算符的两个实现都应该区分行为const和非const对象之间的行为text_block.因此,不应该const在非const版本签名的末尾省略修饰符?这是书中的错误还是我错过了什么?

亲切的问候,Gunnar

Sto*_*ica 6

您将两个重载指定为const

    const char& operator[](const std::size_t position) const;
    char& operator[](const std::size_t position) const;
Run Code Online (Sandbox Code Playgroud)

只需删除const不应该的说明符const.

    const char& operator[](const std::size_t position) const;
    char& operator[](const std::size_t position);
Run Code Online (Sandbox Code Playgroud)

您会收到错误,因为两个重载都具有匹配的参数(出于重载解析的目的).因此,它被认为是一种重新定义.