就像问题中的内容一样 - 为什么这样的代码在C++中是非法的?
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
也没有任何坏处,但无论如何都没有关系。
std::declval
是一个函数,实际上不应该被调用,它只应该出现在未求值的上下文中。如果你不能调用它,那么将其设置为constexpr
是否有意义还不确定。 - NathanOliver