[英]C++ Implicit Conversion Operators Precedence
編輯:在邁克·西摩的評論后,我替換了operator std::string () const;
使用operator char * () const;
並相應地更改了實現。 這允許隱式強制轉換,但是由於某種原因,unsigned long int運算符的優先級高於char *運算符,這感覺不對。。而且,我不想在類,當我有std :: string時。 我有一個預感,我的CustomizedInt類需要從某些東西繼承來支持我想要的功能。 有人可以詳細說明Mike關於std::basic_string
的評論嗎? 我不確定我是否理解正確。
我有這段代碼:
#include <string>
#include <sstream>
#include <iostream>
class CustomizedInt
{
private:
int data;
public:
CustomizedInt() : data(123)
{
}
operator unsigned long int () const;
operator std::string () const;
};
CustomizedInt::operator unsigned long int () const
{
std::cout << "Called operator unsigned long int; ";
unsigned long int output;
output = (unsigned long int)data;
return output;
}
CustomizedInt::operator std::string () const
{
std::cout << "Called operator std::string; ";
std::stringstream ss;
ss << this->data;
return ss.str();
}
int main()
{
CustomizedInt x;
std::cout << x << std::endl;
return 0;
}
其中顯示“ Called operator unsigned long int; 123”。 我的問題是:
刪除運算符unsigned long int后,為什么需要將x強制轉換為std :: string? 為什么不直接調用隱式強制轉換運算符(std :: string)?
字符串的<<
版本是一個模板,由std::basic_string
模板的參數設置參數( std::string
本身是該模板的一種特殊形式)。 它只能通過依賴於參數的查找來選擇,並且僅在參數實際上是std::basic_string
而不是可轉換的東西時才起作用。
是否有任何文檔說明允許哪些隱式強制轉換及其優先順序?
規則非常復雜,您需要閱讀C ++標准以獲取全文。 簡單的經驗法則是,隱式轉換不能包含多個用戶定義的轉換,並且(如您所知),隱式轉換的結果不能用於通過依賴於參數的查找來選擇模板特化。
我不確定我是否完全理解相關的警告。 有人可以概述一下嗎?
我也不完全理解它們。 隱式轉換,名稱查找和模板專業化之間的相互作用(可能還有我現在無法想到的其他因素)非常復雜,並且大多數人都不願意全部學習它們。 在很多情況下不會發生隱式轉換,而在其他情況下可能會在您不期望的情況下發生。 就個人而言,我發現在大多數情況下避免隱式轉換會更容易。
僅定義公共方法ToUnsignedLongInt和ToString是否是更好的做法?
避免不必要的轉換可能是個好主意。 您可以通過留下問題來解決問題,並在必要時明確使用它們:
std::cout << std::string(x) << std::endl;
在C ++ 11中,可以將它們聲明為explicit
,因此只能以這種方式使用它們。 我認為,這將是最好的選擇。 否則,我將按照您的建議使用顯式轉換函數。
順便說一句, main()
的返回類型必須是int
,而不是void
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.