[英]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 ... ; }
也就是說,代替bool
或void*
它們使用指向成員的指針函數,除了被轉換為bool
之外,它將是真正無用的。
也就是說,使用C ++ 11,該語言的設計者注意到了這個問題並設計了以下解決方案:
explicit operator bool() const
{ return ...; }
現在,只有當對象處於真正的bool上下文( if
, while
...)時,才會調用此運算符, while
不是在任何隨機積分操作中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.