簡體   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