为什么std::declval不是constexpr?

5

就像问题中的内容一样 - 为什么这样的代码在C++中是非法的?

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

在标准中是否存在疏忽,或者为什么std::declval不是constexpr,是否有更深层次的原因?


1
std::declval 是一个函数,实际上不应该被调用,它只应该出现在未求值的上下文中。如果你不能调用它,那么将其设置为 constexpr 是否有意义还不确定。 - NathanOliver
1个回答

9
这行代码:

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

因为您在一个已评估的上下文中使用了declval,所以编译失败。这是不允许的,如果您这样做,程序就不符合规范。declval只能在未评估的上下文中调用,例如在decltypesizeof中。

将函数设为constexpr意味着它可以在运行时或编译时被调用。由于declval根本无法被调用,因此将其设置为constexpr毫无意义。我想把它设为constexpr也没有任何坏处,但无论如何都没有关系。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接