簡體   English   中英

我應該在C ++ 11中聲明轉換運算符嗎?

[英]Should I declare conversion operators explicit in C++11?

在C ++ 11中,建議:

  1. 明確定義我們自己的復制/移動構造函數,以便編譯器本身不執行復制/移動構造函數(根據[1] )。
  2. 將一元構造函數顯式聲明為顯式,以避免隱式轉換(根據[2] )。

在這種思路下,是否應該explicit聲明轉換運算符,以防止編譯器使用它們執行隱式轉換?

答案是“不,你不應該”。 顯式轉換運算符已添加到該語言中,以處理下面描述的特定問題。 當您不處理該特定問題時,應該將一個顯式副本構造函數添加到目標類,或者編寫一個命名函數而不是轉換運算符(如std::string c_str() )。

讓我們退后一步,考慮一下轉換。 當您需要編寫一個從AB的轉換代碼時,有兩個選擇-您可以定義一個單參數構造函數,如下所示

struct B {
    B(const A& a);
};

或者您可以定義一個轉換運算符,如下所示:

struct A {
    operator B() const;
};

第一種方法允許在C ++ 11之前進行顯式/隱式控制。 但是,它在兩種情況下不可用:

  • 您擁有A型但沒有B型,或者
  • 您擁有類型A ,但類型B原始類型

根據針對C ++ 11的顯式轉換運算符的草稿草案 ,委員會在爭論將這兩種顯式轉換運算符添加到語言時正是在處理這兩種情況。 (1)隱式和隱式副本構造函數,(2)隱式轉換運算符和(3)命名成員函數已經涵蓋了所有其他情況。

在C ++ 11中,建議:

  1. 明確定義我們自己的復制/移動構造函數,以便編譯器本身不執行此操作。

誰提出這個建議,那都是錯誤的。 只要默認實現適合您的需求,就使用它。 您可能自己不會更好。

  1. 將一元構造函數顯式聲明為顯式,以避免隱式轉換。

C ++核心准則說“默認情況下, explicit聲明單參數構造explicit ”。 在某些情況下,您可能更喜歡隱式構造(例如std::string來自const char* )。 在這些情況下,請忽略explicit聲明。

在這種思路下,是否應該明確聲明轉換運算符,以防止編譯器使用它們執行隱式轉換?

明確地表達它們沒有什么好處。 這意味着該轉換只能與強制轉換一起使用。 強制轉換比getter函數調用更難閱讀。 寫轉換運算符,當您要隱式轉換時,寫getters當您要顯式轉換時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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