问题描述
问题 - 为什么这样的代码在 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
只能在未计算的上下文中调用,例如在 decltype
或 sizeof
中。
创建函数 constexpr
意味着它可以在运行时或编译时调用。由于根本无法调用 declval
,因此将其设为 constexpr
毫无意义。我想将它设为 constexpr
不会有任何危害,但无论如何,都无所谓。