我注意到,在最后一个 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" );
我注意到,在最后一个 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" );
那是对的。
我想原因很简单,它std::max
需要T::operator<
一个任意类型T
,而 for std::max
to be constexpr
,它需要T::operator<
to be constexpr
,这是未知的。
这是对的; std::min
和std::max
are not 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