簡體   English   中英

C ++隱式轉換運算符優先級

[英]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”。 我的問題是:

  1. 刪除運算符unsigned long int后,為什么需要將x強制轉換為std :: string? 為什么不直接調用隱式強制轉換運算符(std :: string)?
  2. 是否有任何文檔說明允許哪些隱式強制轉換及其優先順序? 看來,如果我將運算符unsigned int與運算符unsigned long int一起添加到此類中,則會收到有關<<操作符不明確的編譯器錯誤。
  3. 另外,我知道定義這樣的運算符可能是一種不好的做法,但是我不確定我是否完全理解相關的警告。 有人可以概述一下嗎? 僅定義公共方法ToUnsignedLongInt和ToString是否是更好的做法?

刪除運算符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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM