c++ - 在基本类型上使用 std::declval

标签 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

错误发生在赋值点valstd::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/

相关文章:

c++ - strtod 和下溢

c++ - C++11 中的 CRTP 调度

c++ - 为什么模板没有重新定义,为什么都写在头文件里了?

c++ - 模板参数变量/动态实例化

c++ - 编译器什么时候不生成移动构造函数和移动赋值?

c++11 - 在移动构造函数中使用 std::move

c++ - 交错 std::map 插入和迭代

c++ - 新建 Win32 应用程序向导为空白

java - 仅使用一个递归函数计算 1 到 n 的阶乘之和

c++ - tbb::flow::graph 的功能对象中嵌套对象的问题