2017-04-15 8 views
0

次のコードを検討してください。コンパイラは、それぞれ異なるパラメータを持つ、またはただ1つの、operations()の4つの関数を生成するでしょうか?コンパイラはrefパラメータの新しいテンプレート関数をインスタンス化しますか?

class MyClass 
{ 
    public: 
     void foo() const {} 
}; 

template<typename T> 
void operate(T obj) 
{ 
    obj.foo(); 
} 

int main(int argc, char* argv[]) 
{ 
    MyClass obj; 
    MyClass& refObj = obj; 
    const MyClass& constRefObj = obj; 
    const MyClass constObj = obj; 

    operate(obj); 
    operate(refObj); 
    operate(constRefObj); 
    operate(constObj); 

    return 0; 
} 
+0

これは実際に使用されているコンパイラに依存します –

+0

このコードは、(T = MyClass'を使って)1つの関数しかインスタンス化しないことに注意してください。 –

+0

@ M.Mコールコンストラクタが呼び出されるたびに呼び出されます。私がpar参照としてobjにconst refを渡したとしても? inconveinient !! –

答えて

1

自分で試すことができます。 g++については、g++ -S file.cppを実行して結果を確認してください。あなたのコードでは、g++は1つの関数の実装と、次のような4つの呼び出しを生成しました:call _Z7operateI7MyClassEvT_。あなたが実際にタイプMyClassのオブジェクトを作成する場所

0

最初の宣言

MyClass obj; 

です。 「私は、私は本当にobjを意味する名前refObjを使用する場合、」

2番目の宣言

MyClass& refObj = obj; 

だけでコンパイラに指示します。新しいクラスインスタンスは作成されません。これらの呼び出し

operate(obj); 
operate(refObj); 

だから、両方のは、関数にobjのコピーを渡します。彼らは同じオブジェクトに対して異なる名前を使用しています。だから確かに彼らは同じ機能を呼んでいます。

+0

コピーコンストラクタが呼び出されるたびに呼び出されます。私がpar参照としてobjにconst refを渡したとしても?それは不合理です! –

+0

あなたはconst refを渡さず、 'T'を渡します。関数の宣言は、呼び出しではなくパラメータの受け渡し方法を決定します。 –

関連する問題