0

次の関数テンプレートは、入力された値から最大値を計算しようとします。FT は、単一のデータ型で使用すると問題なく動作しますが、2 つの異なるデータ型で使用すると警告が表示されます。

機能は次のとおりです。

template<typename T,typename U>
const T& maxVal(const T& var1,const U& var2)
{
if(var1<var2)
    return var1;
else
    return var2;
}

ユーザー関数 ( main ) は次のとおりです。

int main(void)
{
  int var1 = 10;
  double var2 = 20.10;
  cout<<maxVal(10,20.10)<<endl;   // warning displayed " returning reference to temporary"
   cout<<maxVal(var1,var2)<<endl; // warning still persists in this case
  return 0;
}

データ型を削除Uして に置き換えるとT、プログラムはスムーズに実行されます。なぜこうなった?

4

4 に答える 4

1
template<typename T>
const T& maxVal(const T& var1,const T& var2)

1 つを使用maxVal(10,20.10)すると、暗黙的に別のものにキャストされます。ここで double は int にキャストされています

template<typename T,typename U>
const T& maxVal(const T& var1,const U& var2)

この実装では、常に返さTれるため、var2最大の場合はキャストされますT

于 2013-08-14T15:00:04.633 に答える
0

実際には次のようなものが必要になる場合があります。

template<typename T, typename U>
auto maxVal(const T& var1, const U& var2) -> decltype(var1<var2?var2:var1)
{
    return var1<var2 ? var2:var1;
}

ただし、コンパイル時にランタイム変数を差し引くことはできません。このようなコードは、コンパイル時に戻り値の型を確認する必要があるため、コンパイル時にのみ機能します。

編集:

驚いたことに、このコードは GCC 4.8 でも実行時変数に使用されても実際に機能します。誰かがこの魔法を説明できることを願っていますか?

EDIT2:

すみません、悪いです。説明については、@Sebastian Redl による以下のコメントを参照してください。

于 2013-08-14T15:17:17.837 に答える