2012-09-14 27 views
4

爲什麼如果(var)...使用數字轉換而不是布爾值? 我有一個同時實現了一類:「if(var)」使用數字轉換而不是布爾值

operator int() { ....} 
operator bool() { ....} 

,但如果我使用:

if (my_class_var) ....; 

那麼int轉換是用來代替boolean!?!編輯: 由於versedmarald說這是正確的。我發現有什麼不同..我實際上用的是:

operator int() { ....} 
operator bool() const { ... } 

還是着迷了,爲什麼不同? gcc版本4.6.2

+0

不知道答案,但只是我的好奇心:它如果通過強制轉換使用bool(例如'if((bool)my_var)')? – nico

+0

你確定嗎?如果你說的是真的,那聽起來像是一個編譯器錯誤。 Visual C++使用'運算符bool()'轉換。 –

+5

Atleast [gcc-4.3.4使用bool運算符重載](http://ideone.com/Ko3Vn)。你使用什麼編譯器? –

回答

1

它沒有(至少使用g++)。我的猜測是你的轉換運算符有錯誤。

#include <iostream> 
class A { 
public: 
    operator int() { return 1; } 
}; 

class B { 
public: 
    operator int() { return 1; } 
    operator bool() { return false; } 
}; 

int main() { 
    A a; 
    B b; 

    if (a) 
     std::cout << "true\n"; 
    else 
     std::cout << "false\n"; 

    if (b) 
     std::cout << "true\n"; 
    else 
     std::cout << "false\n"; 
} 

輸出:

true 
false 
+0

這並不能真正回答任何問題,這實際上應該是一個評論。 –

+1

@我不同意。 「它不。」這個問題肯定是一個有效的答案:「爲什麼'(var)'使用數字轉換而不是布爾?」。 – verdesmarald

+0

@veredesmarald「它不是」可以是一個有效的答案,「它不在g ++上」不是(IMO),除非問題是關於g ++。也就是說,這是有用和太大,以適應評論,所以缺乏更好的選擇,沒有從我的投訴:) – hvd

3

如果你說的是真的,我相信你的編譯器違反了標準:

(6.4節/ 4)的值在switch語句以外的語句中作爲初始化聲明的條件是聲明變量的值在上下文中轉換爲bool(條款4)。如果這種轉換是不合格的,那麼該計劃是不健全的。 [...]

(爲了清楚起見,這是在第6.4節的上下文,其描述ifswitch語句。)

1

有兩種used-defined implicit conversion chains

首先 - class -> bool -> no conversion

二 - class -> int -> bool

n3337 4/2

注:與給定類型的表達式會被隱式轉換爲其他類型的一些背景:

- 當用於if語句或迭代語句(6.4,6.5)的條件中。目標類型 是bool。

n3337 4/3

任一隱式轉換的效果是一樣的執行 聲明和初始化,然後用臨時變量作爲轉換的結果。

行情意味着真正

if (class_var) 

if (bool _ = class_var) 

n3337 13.3.3/1

根據這些定義,一個可行的函數F1被定義爲一個更好的功能如果對於所有參數i,ICSI(F1)不是比ICSi(F2)更差的轉換序列),然後

- 上下文是由用戶定義的轉換(參見8.5,13.3.1.5和13.3.1.6)和 標準轉換序列從返回類型F1到目標類型(即,被初始化的 實體的類型)是比F235的返回類型到目標類型的標準轉換序列更好的轉換序列。 [示例:

struct A { 
A(); 
operator int(); 
operator double(); 
} a; 
int i = a; // a.operator int() followed by no conversion 
//is better than a.operator double() followed by 
//a conversion to int 
float x = a; //ambiguous: both possibilities require conversions, 
//and neither is better than the other 

- 結束例如

因此,編譯器應該選擇operator bool,因爲class -> bool -> no standart conversion優於class -> int -> standard conversion to bool