0
A
回答
3
答案是「不,你不應該」。顯式轉換運算符已添加到該語言中以處理下面描述的特定問題。如果不處理該特定問題,則應該爲目標類添加一個顯式拷貝構造函數,或者編寫一個命名函數,而不是轉換運算符(如std::string
的c_str()
)。
讓我們退後一步,考慮一般轉換。當你需要寫一個轉換代碼去從A
到B
你有兩個選擇 - 你可以定義一個參數的構造函數,這樣
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,推薦:
- 明確定義我們自己的複製/移動構造函數,這樣編譯器不會做它本身。
無論誰提出這個建議,這是錯誤的。只要默認實現符合您的需求,就可以使用它。你可能不會讓自己變得更好。
- 顯式聲明單參數構造函數爲顯式,以避免隱式轉換。
的C++ Core Guidelines說: 「在默認情況下,申報單參數的構造函數explicit
」。在某些情況下,您可能更喜歡使用隱式構造(例如std::string
具有const char*
)。在這些情況下,請不要使用explicit
聲明。
在這個思路中,是否應該將轉換運算符明確地聲明爲防止編譯器使用它們執行隱式轉換?
將它們明確表示並沒有真正的優點。這意味着,轉換隻能用於演員。演員比getter函數調用更難讀。編寫轉換操作符時,如果需要隱式轉換,請在需要顯式轉換時寫入getter。
相關問題
- 1. 我應該在web.config中聲明https嗎?
- 2. 我應該在C#Structures中使用「new」運算符而聲明其中的成員函數嗎?
- 3. 我可以明確定義流運算符和轉換運算符嗎?
- 4. C++ 11明確的轉換運算符/在返回語句構造
- 5. 轉義聲明| tumblr主題運算符
- 6. C++運算符Surchage類聲明
- 7. C++類轉換運算符
- 8. 我應該重載賦值運算符C++嗎?
- 9. 應該顯式運算符在c#中返回null嗎?
- 10. Versant OQL聲明與算術運算符
- 11. 我應該在PHP中執行數學運算嗎,還是轉換爲JavaScript?
- 12. 在C++ 11中,我們應該何時明確使用std :: decay?
- 13. 我應該如何聲明字符串?
- 14. 明確運算符的隱式轉換
- 15. 轉換運算符
- 16. 我應該使用轉換操作符來轉換結構嗎?
- 17. C++中的轉換運算符
- 18. C++我應該使用前向聲明嗎?
- 19. Objective-C:我應該聲明私有方法嗎?
- 20. C++ - 應該在無指針的類中聲明/實現destructior嗎?
- 21. 在C++中應該避免變量聲明嗎?
- 22. 我應該在Python3中使用編碼聲明嗎?
- 23. 或運算符在回報聲明
- 24. C++ 11字符串賦值運算符
- 25. 我可以在LIKE運算符使用之前爲LIKE運算符聲明通配符嗎?
- 26. 如何聲明應該使用C++ 11來編譯我的程序?
- 27. priority_queue聲明和布爾運算符<聲明
- 28. C++:轉換運算符與賦值運算符與轉換構造優先
- 29. 我應該將throw()添加到我的C++析構函數的聲明中嗎?
- 30. 我應該如何在C++項目中聲明全局變量?
「要明確定義我們自己的複製/移動構造函數」Umm,no。你是從哪裏聽來的?或者你把'= default'定義爲定義? – emlai
推薦#1從哪裏來?對於大多數情況,編譯器生成的副本和移動構造函數都很好。它只是手動管理資源的類,例如需要定義自己的資源的內存。 – user4815162342
我完全不同意第1點。遵循[RuleOn](https://turingtester.wordpress.com/2015/06/27/cs-rule-of-zero/),除非您正在編寫資源管理類。 – BoBTFish