[英]strange implicit conversion on C++
我有一个关于意外转换的问题:
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(unsigned int或unsigned long,但从不为int),因此并不是很完美。 尽管如此,简单的标准整数转换仍使(1)易于实现。 但是,还有另一种选择:内置下标运算符。 确实,如果将转换运算符(2)应用于str,我们将获得一个指针类型,并且现在将应用内置下标运算符。 该运算符采用ptrdiff_t参数,在许多平台上该参数等效于int。
我知道(1)的原始参数不匹配,然后将进行隐式转换,但是我不明白为什么编译器将尝试使用(2)转换str。
谢谢。
如果我像这样“扩展”您的代码,并使第二个下标运算符方法为const,那么结果将是
#include <iostream>
#include <cstring>
class BadString {
public:
char s[1024];
BadString(const char* s_) {
strncpy(s, s_, strlen(s_) + 1);
}
char& operator[](size_t pos) {
return s[pos];
}
const char& operator[](size_t pos) const {
return s[pos];
}
operator char*() {
std::cout << "operator char*\n";
}
operator const char*() {
std::cout << "operator const char*\n";
}
};
int main() {
BadString bs("correkt");
bs[5] = 'c';
std::cout << bs.s << "\n";
}
然后编译并运行,它可以按预期工作,输出仅为一行
correct
发生(2)
隐式转换运算符之类的事实意味着您没有提供有关BadString
类的完整信息。 也许您应该这样做。
并且,当然,如果像在提供的示例中那样实现,则没有任何理由调用(2)
隐式转换运算符。
UPD:关于你的评论中提及了什么思考,我想的目的, operator const char*()
是显式转换像
(const char*)bs
返回指向bs
持有的数组s
第一个元素的指针。 那当然是不正确的,而且有点丑陋,但是我看到的是唯一的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.