3

max私は、最後の C++-Std Doc N3291 の [24.4.7] ではないことに気付きました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呼び出し、 forを beにすると、 be が必要になるためだと思いますが、これは不明です。T::operator<Tstd::maxconstexprT::operator<constexpr

于 2011-08-21T10:43:27.663 に答える
2

正解です; std::minstd::maxconstexprC++14 の最新ドラフト ( N3690 ) でさえないため、定数式内では使用できません。

これには正当な理由はなく、悪い理由だけです。最も重大な悪い理由は、C++ 委員会が標準化に取り組む時間が限られている個人で構成されており、これらの関数を作成するために必要な作業をconstexprまだ誰も行っていないことです。

2010 年に採用された C++ 標準への変更であるN3039に注意constexprしてください。minmaxconstexpr

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
于 2013-07-20T18:03:49.247 に答える