2017-05-03 64 views
2

我不明白爲什麼以下啞類:C++運算符少使用轉換操作符

class Foo { 
public: 
    operator double() const { 
     return 3.14; 
    } 
}; 

當我嘗試比較實例:

Foo f1; 
Foo f2; 

auto res = f1 < f2; 

少運營商使用現有

operator double()const

比較值時。我在哪裏可以找到這種行爲的規則?

+3

你在找這個? http://en.cppreference.com/w/cpp/language/implicit_conversion –

+2

[C++標準是找到規則的地方。](http://eel.is/c++draft/) – StoryTeller

回答

5

你的編譯器「希望」,讓您<要求的工作。

Foo沒有operator<,但它看到有一種方法可以將Foo轉換爲double。就這樣,通過隱式轉換,你的比較就能夠取得成功。

如果操作員被標記爲explicit(C++ 11或更新版本),則這種隱式轉換將是不可能的,編譯器將不得不放棄您的<請求。

用於在通話過程中選擇功能的規則是非常複雜的,所以如果我是你,我只相信,它的作品,而不是試圖解析規範的寫法。 :)

+2

我覺得關於使操作員明確的話是有條理的。當然,如果OP想要防止這種情況發生,則會以隱式轉換爲代價。 – StoryTeller

+1

@StoryTeller:好主意。 –

10

正如在評論中提到的,編譯器允許進行1用戶定義的轉換,因爲它是在這裏做。它認爲,這既可以將對象轉換爲doubledouble確實有operator <,所以它做到這一點。如果你只是想用你的轉換操作符,當你(程序員)問它你可以添加explicit

explicit operator double() const { 
    return 3.14; 
} 

現在,編譯器可能只調用它,當你明確地將它轉換爲這樣的類型:

Foo f1; 
double d = (double)f1; // conversion operator