奇怪的隐式转换C++

strange implicit conversion on C++

本文关键字:转换 C++      更新时间:2023-10-16

我有一个关于意外转换的问题:

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(无符号 int 或无符号 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

返回指向数组的第一个元素的指针 sbs持有该元素。也就是说,当然,不正确,而且有点丑,但我看到唯一的选择。