当模板参数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&&
的返回类型,不是吗? 最佳答案
您正在尝试分配一个右值。 std::declval<int>()
正确返回int&&
类型。它没有名称,因此它是int
类型的右值(更确切地说是xvalue)。然后,您尝试将val
分配给该右值,这对于基本类型是非法的。
这是live example,以简化形式(没有declval
)演示了该问题。