2011-01-03 17 views
0

この例は「Thinking in C++」のものですが、演算子変換関数を合成するコンパイラに関する質問が1つあります。C++演算子オーバーロード合成変換

質問
クラスつの目的は、()(関数呼び出しFに)渡された場合、過負荷運転()が呼び出されます。しかし、私はこの変換を達成するためにコンパイラによって使用されたロジック(コンパイラはオペレーションコールを合成する)を作ることができません。

最大では、明示的な変換動作が期待できます。
1. obj3 =(3)obj4;
2. obj3 = 3(obj4)。
3。obj3 = static_cast <Three>(obj4);

上記の変換のいずれかについて、コンパイラはどのように合成しますか?
(3)obj4.operator()?

多分私はいくつかの大きなポイントを見逃している可能性があります。

//: C12:Opconv.cpp 
// Op overloading conversion 

class Three { 
    int i; 
public: 
    Three(int ii = 0, int = 0) : i(ii) {} 
}; 

class Four { 
    int x; 
public: 
    Four(int xx) : x(xx) {} 
    operator Three() const { return Three(x); } 
}; 

void g(Three) {} 

int main() { 
    Four four(1); 
    g(four); 
    g(1); // Calls Three(1,0) 
} ///:~ 

答えて

0

まず、class Fourにはoperator()が含まれていませんが、変換演算子であるoperator Three()が含まれています。

g(four); 

コンパイラはclass Threeのオブジェクトにfourを変換する必要があり、その変換を実行するoperator Three()への呼び出しを合成ラインにおいて

。 合成された変換は、

g(four.operator Three()); 
1

は、まず第一に、それはあなたが提供しているoperator()ではない、それはoperator Threeです。この演算子は、class Fourのオブジェクトをclass Threeのオブジェクトに変換する方法をコンパイラに指示します。 g(four)では、関数gがタイプThreeの引数を要求しているため、コールコンパイラはこの演算子を使用しています。変換があるので、コンパイラはそれを使用しています。 Threeのコンストラクタがexplicitとして宣言されていないので、第二の場合には、コンパイラはそうclass Threeその関数のオブジェクトを作成することconstuctorを使用している(Threeコンストラクタを使用して)単一の整数を使用してclass Threeのオブジェクトを構築することが可能であるg呼び出すことができます。

関連する問題