C ++ 11:static_assert()中的std :: max(a,b)?

时间:2011-08-21 10:40:11

标签: c++11 const assert constexpr static-assert

我注意到,在最后一个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" );

2 个答案:

答案 0 :(得分:4)

这是正确的。

我想原因只是std::max为任意类型T::operator<调用T而对std::max调用constexpr,它需要T::operator< 1}}为constexpr,这是未知的。

答案 1 :(得分:2)

这是正确的; std::minstd::max不是constexpr,即使在C ++ 14(N3690)的最新草稿中也是如此,因此它们不能在常量表达式中使用。

这没有充分的理由,只有不好的理由。最重要的坏理由是C ++委员会由那些在标准化工作上花费时间有限的人组成,而且还没有人投入完成这些功能所需的工作constexpr

注意N3039,对2010年采用的C ++标准进行了更改,专门略微扩展了constexpr工具,以便可以制作minmax等功能constexpr

您可以通过定义自己的minmax函数来解决此问题:

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