我注意到,在最后一个C ++的[24.4.7]中 - Std Doc N3291 max
不是constexpr
:
template<class T> const T& max(const T& a, const T& b);
因此,例如,不允许在static_assert
中使用它。正确的吗?
static_assert( max(sizeof(int),sizeof(float)) > 4, "bummer" );
答案 0 :(得分:4)
这是正确的。
我想原因只是std::max
为任意类型T::operator<
调用T
而对std::max
调用constexpr
,它需要T::operator<
1}}为constexpr
,这是未知的。
答案 1 :(得分:2)
这是正确的; std::min
和std::max
不是constexpr
,即使在C ++ 14(N3690)的最新草稿中也是如此,因此它们不能在常量表达式中使用。
这没有充分的理由,只有不好的理由。最重要的坏理由是C ++委员会由那些在标准化工作上花费时间有限的人组成,而且还没有人投入完成这些功能所需的工作constexpr
。
注意N3039,对2010年采用的C ++标准进行了更改,专门略微扩展了constexpr
工具,以便可以制作min
和max
等功能constexpr
。
您可以通过定义自己的min
和max
函数来解决此问题:
template<typename T>
constexpr const T &c_min(const T &a, const T &b) {
return b < a ? b : a;
}
template<typename T, class Compare>
constexpr const T &c_min(const T &a, const T &b, Compare comp) {
return comp(b, a) ? b : a;
}
template<typename T>
constexpr const T &c_min_impl(const T *a, const T *b) {
return a + 1 == b ? *a : c_min(*a, c_min_impl(a + 1, b));
}
template<typename T>
constexpr T c_min(std::initializer_list<T> t) {
return c_min_impl(t.begin(), t.end());
}
// ... and so on