2016-11-15 17 views
2

変換演算子を無効にする方法はありますか?それらを「=削除」とマークすると、他のものが混乱する。変換演算子を削除する

は、次のコードを考えてみましょう:

class Foo 
{ 
public: 

    Foo() :mValue(0) {} 
    ~Foo() = default; 
    Foo(int64_t v) { mValue = v; } 
    Foo(const Foo& src) = default; 

    bool operator==(const Foo& rhs) { return mValue == rhs.mValue; } 

    /* after commenting these lines the code will compile */ 
    operator int() const = delete; 
    operator int64_t() const = delete; 

private: 
    int64_t mValue; 
}; 

int main() 
{ 
    Foo foo1(5); 
    Foo foo2(10); 
    bool b1 = (foo1 == foo2); 
    bool b2 = (foo1 == 5); 
} 

gccは==演算子があいまいであることを不平を言うので、これはコンパイルされません:、コードがする変換演算子をコメントした後、

test.cc: In function ‘int main()’: 
test.cc:25:21: error: ambiguous overload for ‘operator==’ (operand types are ‘Foo’ and ‘int’) 
    bool b2 = (foo1 == 5); 
        ^
test.cc:25:21: note: candidates are: 
test.cc:25:21: note: operator==(int, int) <built-in> 
test.cc:25:21: note: operator==(int64_t {aka long int}, int) <built-in> 
test.cc:10:10: note: bool Foo::operator==(const Foo&) 
    bool operator==(const Foo& rhs) { return mValue == rhs.mValue; } 
     ^

しかし、コンパイルしてうまく動作します。

最初の質問は、削除されたコンバージョン演算子が==演算子のあいまい性を作成するのはなぜですか?私は暗黙のFoo - > int変換を無効にすべきだと思っていましたが、私には論理がないint - > Foo変換に影響するようです。

第2の1つ:変換演算子を削除する方法はありますか?はい、宣言しないことによって - しかし、私は、将来の誰でもこれらの変換が設計によって無効になっていることを知る方法を探しています。

+0

[なぜC++ 11で削除された関数が過負荷解決に関与しているのですか?](http://stackoverflow.com/questions/14085620/why-do-c11-deleted-functions-participate-in-overload -解決) – moooeeeep

答えて

2

のための明示的な変換を使用することができますここで私が問題の核心だと思うものです:

[dcl.fct.def.delete]

プログラムそれを宣言する以外に、暗黙的にまたは明示的に削除された関数を参照することは、不正な形式です。
...
削除された関数は、暗黙的にインライン関数([dcl.inline])です。

[class.member.lookup/4]

Cは、名前fの宣言が含まれている場合は、宣言が を設定すると、ルックアップが発生している言語構造の 要件を満たすCで宣言されたFのすべての宣言が含まれています。

あなたがdelete機能を使用しても、それでも宣言します。宣言された関数が過負荷解決に関与します。これは、解決されたオーバーロードであるときのみ、コンパイラが削除されているかどうかをチェックします。

あなたのケースでは、それらの関数宣言が存在する場合、明らかなあいまいさがあります。

3

削除された機能の使用は不正です(プログラムは がコンパイルされません)。

関数がオーバーロードされている場合は、最初にオーバーロードの解決が行われ、削除された関数が の場合、プログラムは不正な形式になります。

あなたは3バリアント

  • int型持ってbecouseあなたはケースプログラムの開発は、変換を選択することはできません - > Fooの

  • はFoo - > int型

  • はFoo - > int64モード

    は、

第2q uestion: あなたはそれがあるとしてそれを残し、常にint型

bool b2 = (foo1 == Foo(5)); 
関連する問題