変換演算子を無効にする方法はありますか?それらを「=削除」とマークすると、他のものが混乱する。変換演算子を削除する
は、次のコードを考えてみましょう:
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つ:変換演算子を削除する方法はありますか?はい、宣言しないことによって - しかし、私は、将来の誰でもこれらの変換が設計によって無効になっていることを知る方法を探しています。
[なぜC++ 11で削除された関数が過負荷解決に関与しているのですか?](http://stackoverflow.com/questions/14085620/why-do-c11-deleted-functions-participate-in-overload -解決) – moooeeeep