当模板参数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)演示了该问题。

10-06 07:53
查看更多