以下代码在模板参数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
)。
关于c++ - 在基本类型上使用 std::declval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19112471/