2017-06-20 2 views
4

あなたはどんな点でより良いと思いますか?テンプレート識別子とテンプレート関数内のdecltypeパラメータタイプ

template <typename T> void func(T x,T y) {} 

又は

template <typename T> void func(T x,decltype(x) y) {} 

私見は、第2の形態は、xとyの種類との間でリンクが明示的であるため、好ましいと思われる、少なくともテンプレート識別子ものの名前を変更すると、より少ないエラーが発生しやすいと思われる場合。

EDIT

2番目の形式は最初の形式はまったく同じタイプを必要としているときに、最初のパラメータのための1つの使用のサブタイプを持つ関数を呼び出してみましょう。この議論は以前の議論よりもやや良いようです。

+2

第2の形式も不要であるようです。 – DeiDei

+1

私は実際に 'decltype'の代わりにユースケースを得ていません。なぜあなたはそのようなものを望んでいるのかを精緻化するように気をつけますか? –

+0

2番目の形式では、最初の形式ではなく、 'y'の暗黙的な変換を有効にしませんか? – Quentin

答えて

3

意味的に異なるので、達成したいことに依存します。 2番目は最初のものよりも制限的です。考えてみましょう:SFINAEで

template <typename T> void func1(T x, decltype(x) y) {} 
template <typename T> void func2(T x, T y) {} 

func1(2., 4); // converts 4 to double 
func2(2., 4); // fails to compile 

はそれが(ないnecessarelyコンパイルエラー)異なるコンパイル時の行動につながることができますコンテキスト、および2つのオプションは、間接的に異なるプログラムをコンパイルすることができます。

2

両方の形式は、正確にはと同じではありません。 2番目のものは推論されません。

最初の引数は、引数の1つに暗黙的な変換(サブタイプだけでなく)を許可しません。これは、変換するタイプに予想される型(たとえばint)を統一することができないためですfloat):See on coliru

関連する問題