当模板参数T
是基本类型(例如int
(在gcc 4.8上)时,以下代码无法编译。这是标准的符合行为吗?我对std::declval
的理解是它始终解析为T&&
或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&&
,不应该吗?
答案 0 :(得分:3)
您正在尝试分配右值。 std::declval<int>()
正确返回类型int&&
。它没有名称,因此它是int
类型的右值(更确切地说,xvalue)。然后,您尝试将val
分配给此右值,这对于基本类型是非法的。
这是live example以简化形式展示问题(没有declval
)。