2017-05-03 4 views
2

私は理解できない変換演算子を使用する理由、次のダミークラスのため:C++少ないオペレータは

Foo f1; 
Foo f2; 

auto res = f1 < f2; 

少ないオペレータは、既存の

を使用しています:私はインスタンスを比較してみてください

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

演算子double()const

値を比較する場合は3210

です。この行動のルールはどこで見つけることができますか?

+3

これはお探しですか? http://en.cppreference.com/w/cpp/language/implicit_conversion –

+2

[C++標準はルールを見つける場所です。](http://eel.is/c++draft/) – StoryTeller

答えて

5

あなたのコンパイラはあなたの<要求を働かせたいと思っています。

Fooにはoperator<はありませんが、Foodoubleに変換する方法があることがわかります。これにより、の暗黙的な変換によって、比較が成功するようになります。

オペレータがexplicit(C++ 11以降)とマークされている場合、この暗黙的な変換は不可能であり、コンパイラは<リクエストをあきらめてしまいます。

通話中に機能を選択するためのルールは非常に複雑なので、私があなただったら標準の言い回しを解析するのではなく、機能すると信じています。 :)

+2

私は演算子を明示的にすることについての言葉は順番にある。もちろん、OPが暗黙のコンバージョンを犠牲にして、このことが起こらないようにしたい場合。 – StoryTeller

+1

@StoryTeller:いい考えです。 –

10

コメントに記載されているように、コンパイラはここでやっているように1つのユーザー定義変換を行うことができます。両方のオブジェクトをdoubleに、doubleoperator <に変換できることが分かります。あなただけの変換演算子を使用する場合(プログラマ)はそれを求めるときにexplicitを追加することができます:あなたは明示的な型にキャストするとき

explicit operator double() const { 
    return 3.14; 
} 

今、コンパイラは唯一それを呼び出すことがあります。

Foo f1; 
double d = (double)f1; // conversion operator 
関連する問題