3

我注意到,在最后一个 C++-Std Doc N3291 的 [24.4.7] 中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" );
4

2 回答 2

4

那是对的。

我想原因很简单,它std::max需要T::operator<一个任意类型T,而 for std::maxto be constexpr,它需要T::operator<to be constexpr,这是未知的。

于 2011-08-21T10:43:27.663 回答
2

这是对的; std::minstd::maxare not constexpr,甚至在最新的 C++14 草案(N3690)中也没有,因此它们不能在常量表达式中使用。

这没有好的理由,只有不好的理由。最重要的不好的原因是 C++ 委员会是由一些时间有限的人组成的,他们从事标准化工作的时间有限,而且还没有人投入到实现这些功能所需的工作中constexpr

注意N3039是对 2010 年采用的 C++ 标准的更改,它略微扩展了该constexpr设施,以便可以制作min和等功能。maxconstexpr

您可以通过定义自己的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
于 2013-07-20T18:03:49.247 回答