1

次のコードは、テンプレート パラメーターが(gcc 4.8 の場合)Tなどの基本的な型の場合、コンパイルに失敗します。intこの標準準拠の動作はありますか? 私の理解でstd::declvalは、常に aT&&またはのいずれかに解決されますT&

template <class T>
void foo(T&& val)
{
  std::cout << noexcept(std::declval<typename std::decay<T>::type>() = val);
}

struct bar { };
bar b;
foo(b); // okay

int a;
foo(a); // error: using xvalue (rvalue reference) as lvalue

val式に代入する時点でエラーが発生しますstd::declval

を削除して直接std::decay使用すると機能しますstd::declval<T>が、その理由はわかりません。減衰型はそのままである必要があるintためstd::declval<int>()、戻り値の型を持つint&&べきではありませんか?

4

1 に答える 1

3

右辺値に代入しようとしています。std::declval<int>()type を正しく返しますint&&。名前がないので、 type の右辺値 (より正確には xvalue) ですint。次に、この右辺値に代入しようとしていますがval、これは基本型には無効です。

これは、単純化された形式で問題を示す実際の例です (なし)declval

于 2013-10-01T09:50:32.913 に答える