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