簡體   English   中英

C ++轉換運算符

[英]C++ conversion operator

在以下代碼中:

if ( cin >> x ) { /* ... */ }

標准庫定義了一個操作符轉換操作符void * ,它將類型istream轉換為void * 但是,如果if測試一個條件,為什么標准庫沒有定義從類型istream到類型bool的轉換? 或者實施背后是否有任何隱含的考慮?

原因很簡單,您不希望意外地轉換為int 例如,假設有一個隱含的轉換為bool而你寫了

if (std::cin << x) { /* ... */ }

編譯器無法捕獲明顯的錯誤(使用<<而不是>> ),因為隱式轉換將轉換為int並愉快地移動結果。 這幾乎肯定不是預期的。 void*不能移位,即編譯器會產生錯誤。

在C ++ 11之前,沒有辦法將轉換運算符標記為explicit 您只能將轉換構造函數標記為explicit 在C ++ 11中,流的轉換運算符實際上已更改為explicit轉換為bool因為轉換為void*也存在一些問題。

operator bool()一直有點問題。 主要問題是C ++中的bool是一個算術運算符,因此任何實現operator bool()都可以自動轉換為int

因此,以下代碼是合法的,但是沒有意義:

cout << (2 * cin);

標准庫的設計者認為操作員不太可能導致問題,同時能夠轉換為bool將是operator void* 我們的想法是,無法將void*用於任何事情。

也就是說,其他更現代的庫,比如boost有時會使用以下習語:

typedef void *this_type::*unspecified_bool_type;

operator unspecified_bool_type() const { return ... ; }

也就是說,代替boolvoid*它們使用指向成員的指針函數,除了被轉換為bool之外,它將是真正無用的。

也就是說,使用C ++ 11,該語言的設計者注意到了這個問題並設計了以下解決方案:

explicit operator bool() const
{ return ...; }

現在,只有當對象處於真正的bool上下文( ifwhile ...)時,才會調用此運算符, while不是在任何隨機積分操作中。

暫無
暫無

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

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