【发布时间】:2026-01-29 17:45:02
【问题描述】:
在<cinttypes>中,从C++11开始,就有the following two重载:
std::intmax_t abs( std::intmax_t n );
std::intmax_t imaxabs( std::intmax_t n );
为什么不是constexpr这两个函数?
【问题讨论】:
-
@BasileStarynkevitch:您能解释一下这些兼容性原因之一吗?
-
@BasileStarynkevitch 我不买那个。给定一个兼容的编译器,一段 constexpr 代码将与它使用的一样工作,即当传入非 constexpr 值时,它将返回一个非 constexpr。如果最好不使这些函数为 constexpr (或与 constexpr 重载)兼容,那么最好不包括矢量的移动指导。由于它使用命名空间(所以不是 C)并且是仅在 C++11 中提供的标头,我希望看到 constexpr overlaods。
-
abs是一个 C99 函数。而C99不知道constexpr -
有 很多 函数可能是 constexpr 而不是 (还)。随着标准的每次修订,更多的函数将慢慢变成 constexpr。随意参与该过程(isocpp.org 上的说明)。
-
abs不是constexpr,因为标准是这样决定的。我认为这是问为什么的错误地方。我可以说的是,如果您真的需要constexpr abs,请编写您自己的。你不会出错的。