2012-01-20 10 views
2

は以下の小さな例を考えてみましょう:'T'のようなテンプレート引数は、常に値として解釈されますか?

template<typename T> void foo(T a) { ... } 
struct Bar { ... }; 
Bar x; 
foo(x); 

私の質問:foo(x)が(参照渡しX)foo(const Bar& x)と解釈することができる、またはそれは常にfoo(Bar x)(すなわち明示的な値で渡さXと解釈されている任意の場合がありますxのコピー)?

私の具体的なアプリケーションでは、私のコードは、コピーが作成されたことに依存しています(xは別のスレッドで使用され、元のxは範囲外になります)。しかし、私はそれが可能かどうかはわかりません。私はGCC 4.6.1を使用しています。

+0

例で試してみませんか?私はTがintからポインタなどになることができると思います。 –

答えて

5

を推定した場合、それは常に値によって渡されます。しかし、テンプレート引数を明示的にすると、参照渡しにすることができます。

foo<Bar&>(x); // will pass by reference 
foo<Bar const&>(x); // will pass by reference to const 
1

書かれているとおり、Barオブジェクトは値渡しされます。参照する必要がある場合は、いつでも別の関数を定義することができます。

Ex。

template<typename T> void fooByRef(const T& a) { ... } 
関連する問題