为什么std::declval不是constexpr?
就像问题一样 - 为什么这样的代码在 cpp 中是非法的?
static_assert(std::declval<std::array<int, 4>>().size() == 4);
static_assert(std::declval<std::array<int, 4>>().size() == 4);
这是标准中的一个疏忽还是有一些更深层次的理由为什么std::declval不是constexpr?
回答
这一行:
无法编译,因为您正在declval评估的上下文中使用。这是不允许的,如果你这样做,你的程序就是格式错误的。declval只能在未评估的上下文中调用,例如在 adecltype或 中sizeof。
创建一个函数constexpr意味着它可以在运行时或编译时调用。由于declval根本无法调用,因此没有意义constexpr。我想制作它不会有任何伤害constexpr,但无论哪种方式,都无所谓。