我不明白爲什麼以下啞類:C++運算符少使用轉換操作符
class Foo {
public:
operator double() const {
return 3.14;
}
};
當我嘗試比較實例:
Foo f1;
Foo f2;
auto res = f1 < f2;
少運營商使用現有
operator double()const
比較值時。我在哪裏可以找到這種行爲的規則?
我不明白爲什麼以下啞類:C++運算符少使用轉換操作符
class Foo {
public:
operator double() const {
return 3.14;
}
};
當我嘗試比較實例:
Foo f1;
Foo f2;
auto res = f1 < f2;
少運營商使用現有
operator double()const
比較值時。我在哪裏可以找到這種行爲的規則?
你的編譯器「希望」,讓您<
要求的工作。
Foo
沒有operator<
,但它看到有一種方法可以將Foo
轉換爲double
。就這樣,通過隱式轉換,你的比較就能夠取得成功。
如果操作員被標記爲explicit
(C++ 11或更新版本),則這種隱式轉換將是不可能的,編譯器將不得不放棄您的<
請求。
用於在通話過程中選擇功能的規則是非常複雜的,所以如果我是你,我只相信,它的作品,而不是試圖解析規範的寫法。 :)
我覺得關於使操作員明確的話是有條理的。當然,如果OP想要防止這種情況發生,則會以隱式轉換爲代價。 – StoryTeller
@StoryTeller:好主意。 –
正如在評論中提到的,編譯器允許進行1用戶定義的轉換,因爲它是在這裏做。它認爲,這既可以將對象轉換爲double
和double
確實有operator <
,所以它做到這一點。如果你只是想用你的轉換操作符,當你(程序員)問它你可以添加explicit
:
explicit operator double() const {
return 3.14;
}
現在,編譯器可能只調用它,當你明確地將它轉換爲這樣的類型:
Foo f1;
double d = (double)f1; // conversion operator
你在找這個? http://en.cppreference.com/w/cpp/language/implicit_conversion –
[C++標準是找到規則的地方。](http://eel.is/c++draft/) – StoryTeller