我正在尝试使用"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
您将两个重载都指定为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)
您会收到错误,因为两个重载都具有匹配的参数(出于重载解析的目的).因此,它被认为是一种重新定义.