2015-12-23 96 views
0

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

  1. 明確定義我們自己的複製/移動構造,使(根據 [1])編譯器不這樣做本身。
  2. 顯式聲明單參數構造函數爲顯式,以避免隱式轉換(根據 [2])。

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

+5

「要明確定義我們自己的複製/移動構造函數」Umm,no。你是從哪裏聽來的?或者你把'= default'定義爲定義? – emlai

+8

推薦#1從哪裏來?對於大多數情況,編譯器生成的副本和移動構造函數都很好。它只是手動管理資源的類,例如需要定義自己的資源的內存。 – user4815162342

+7

我完全不同意第1點。遵循[RuleOn](https://turingtester.wordpress.com/2015/06/27/cs-rule-of-zero/),除非您正在編寫資源管理類。 – BoBTFish

回答

3

答案是「不,你不應該」。顯式轉換運算符已添加到該語言中以處理下面描述的特定問題。如果不處理該特定問題,則應該爲目標類添加一個顯式拷貝構造函數,或者編寫一個命名函數,而不是轉換運算符(如std::stringc_str())。

讓我們退後一步,考慮一般轉換。當你需要寫一個轉換代碼去從AB你有兩個選擇 - 你可以定義一個參數的構造函數,這樣

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

,或者你可以定義轉換操作符,就像這樣:

struct A { 
    operator B() const; 
}; 

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

  • 你自己的類型A但你不知道自己的類型B,或
  • 你自己的類型A,但鍵入B原始

根據C++ 11顯式轉換運算符的draft paper,委員會在討論將明確的轉換運算符添加到語言中時正在處理這兩種情況。所有其他情況已被(1)隱式和隱式拷貝構造函數,(2)隱式轉換運算符和(3)命名成員函數覆蓋。

4

在C++ 11,推薦:

  1. 明確定義我們自己的複製/移動構造函數,這樣編譯器不會做它本身。

無論誰提出這個建議,這是錯誤的。只要默認實現符合您的需求,就可以使用它。你可能不會讓自己變得更好。

  1. 顯式聲明單參數構造函數爲顯式,以避免隱式轉換。

C++ Core Guidelines說: 「在默認情況下,申報單參數的構造函數explicit」。在某些情況下,您可能更喜歡使用隱式構造(例如std::string具有const char*)。在這些情況下,請不要使用explicit聲明。

在這個思路中,是否應該將轉換運算符明確地聲明爲防止編譯器使用它們執行隱式轉換?

將它們明確表示並沒有真正的優點。這意味着,轉換隻能用於演員。演員比getter函數調用更難讀。編寫轉換操作符時,如果需要隱式轉換,請在需要顯式轉換時寫入getter。

相關問題