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" );
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" );
それは正しいです。
その理由は単純に、任意の型をstd::max
呼び出し、 forを beにすると、 be が必要になるためだと思いますが、これは不明です。T::operator<
T
std::max
constexpr
T::operator<
constexpr
正解です; std::min
とstd::max
はconstexpr
C++14 の最新ドラフト ( N3690 ) でさえないため、定数式内では使用できません。
これには正当な理由はなく、悪い理由だけです。最も重大な悪い理由は、C++ 委員会が標準化に取り組む時間が限られている個人で構成されており、これらの関数を作成するために必要な作業をconstexpr
まだ誰も行っていないことです。
2010 年に採用された C++ 標準への変更であるN3039に注意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