次のコードは、テンプレート パラメーターが(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&&
べきではありませんか?