繁体   English   中英

C ++上的奇怪的隐式转换

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM