【发布时间】:2015-01-14 14:29:52
【问题描述】:
我有一个关于意外转换的问题:
class BadString
{
public:
BadString(char const*);
...
char& operator[] (size_t); //(1)
char const& operator[] (size_t);
operator char* (); //(2)
operator char const* ();
};
int main()
{
BadString str("correkt");
str[5] = 'c'; //possibly an overload resolution ambiguity !!!
}
解释是这样的:
(1) 处的下标运算符似乎是完美匹配。然而,它不是很完美,因为参数 5 的类型为 int,并且运算符需要 size_t(无符号整数或无符号长整数,但绝不是整数)。尽管如此,一个简单的标准整数转换使得 (1) 很容易实现。 但是,还有另一个候选:内置的下标运算符。实际上,如果我们将转换运算符 (2) 应用于 str,我们将获得一个指针类型,现在应用内置的下标运算符。此运算符采用 ptrdiff_t 参数,在许多平台上它等价于 int。
我知道 (1) 的原始参数不匹配,然后会发生隐式转换,但我不明白为什么编译器会尝试使用 (2) 转换 str。
谢谢。
【问题讨论】:
-
你的代码不应该编译:你正在通过返回类型重载
operator[]。 -
您需要使函数
char const& operator[] (size_t)保持不变,例如char const& operator[] (size_t) const; -
引用内容时最好注明出处。
-
隐含
operator char *无论如何都是个坏主意 -
“C++ 模板,完整指南”,VanDeVoorde & Josuttis:B.2.1 成员函数的隐含参数