为什么 std::declval 不是 constexpr?

问题描述

问题 - 为什么这样的代码在 cpp 中是非法的?

static_assert(std::declval<std::array<int,4>>().size() == 4);

这是标准中的疏忽还是有更深层次的理由为什么 std::declval 不是 constexpr

解决方法

这一行:

static_assert(std::declval<std::array<int,4>>().size() == 4);

编译失败,因为您在评估上下文中使用 declval。这是不允许的,如果你这样做,你的程序就是格式错误的。 declval 只能在未计算的上下文中调用,例如在 decltypesizeof 中。

创建函数 constexpr 意味着它可以在运行时或编译时调用。由于根本无法调用 declval,因此将其设为 constexpr 毫无意义。我想将它设为 constexpr 不会有任何危害,但无论如何,都无所谓。