2017-09-01 5 views
1

Tが参照(これはl-valueまたはr-valueですが、ここでは関係ありません)と推測されているため、次のコードはコンパイルされません。だからstd::vectorは引数としてもうTを取ることができません。誰でもこれを解決する方法を知っていますか?ありがとう!テンプレートパラメータを正しく渡すにはどうすればよいですか?

template<typename T> 
void func(T&& t) 
{ 
    std::vector<T> v; 
} 

回答:std::decayをコメントとして使用してください。

+2

問題を発生させる[MCVE]を入力してください。 –

+4

['std :: decay'](http://en.cppreference.com/w/cpp/types/decay) – SirGuy

+0

ありがとうSirGuy!出来た! – Dave

答えて

1

推論型の引数の宣言方法は、引数の使用方法によって異なります。関数は、引数TX&になりますタイプXの左辺値で呼び出された場合

  • :示さ宣言では、関数が呼び出されたかに応じて、テンプレート引数を推定転送参照として引数を宣言しました
  • 関数は、引数TX

得られた引数がInteにあるであろう型Xの右辺値で呼び出された場合ことがnded(すなわち、あなたの」どこかを転送し、あなたではなくあなたの引数を消費した場合、最も可能性の高い

std::forward<T>(t) 

を使用して使用されている(つまり、引数がどこかピットである)あなたは値によってそれを取るために、おそらくオフビートされていますdはf(T t)を使用してください)、std::move(t)の値を最終的な宛先に入力します。あなたは引数を読むことはできますが、消費しない場合は、おそらくそれをT const&として渡すべきです。

転送参照の使用が意図的であると仮定すると、std::vectorは、推論型から得られる対応する型で宣言する必要があります。

std::vector<std::decay_t<T>> v; 
関連する問題