在基本类型上使用std :: declval

时间:2013-10-01 09:22:41

标签: c++ c++11

当模板参数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&&,不应该吗?

1 个答案:

答案 0 :(得分:3)

您正在尝试分配右值。 std::declval<int>()正确返回类型int&&。它没有名称,因此它是int类型的右值(更确切地说,xvalue)。然后,您尝试将val分配给此右值,这对于基本类型是非法的。

这是live example以简化形式展示问题(没有declval)。