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

发布于 2024-11-30 18:54:03 字数 339 浏览 2 评论 0原文

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

I noticed, that in [24.4.7] of the last C++-Std Doc N3291 max ist not constexpr:

template<class T> const T& max(const T& a, const T& b);

Therefore, it is not allowed to use it in a static_assert for example. Correct?

static_assert( max(sizeof(int),sizeof(float)) > 4, "bummer" );

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

心的憧憬 2024-12-07 18:54:03

这是正确的。

我想原因很简单, std::max 为任意类型 Tstd:调用 T::operator< : :maxconstexpr,则需要 T::operator<constexpr,这是未知的。

That is correct.

I imagine the reason is simply that std::max calls T::operator< for an arbitrary type T and for std::max to be constexpr, it would require T::operator< to be constexpr, which is unknown.

牵你手 2024-12-07 18:54:03

这是正确的; 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

This is correct; std::min and std::max are not constexpr, not even in the latest draft of C++14 (N3690), so they cannot be used within constant expressions.

There is no good reason for this, only bad reasons. The most significant bad reason is that the C++ committee is composed of individuals who have a limited amount of time to work on standardization, and no-one has put in the work required to make these functions constexpr yet.

Note N3039, a change to the C++ standard adopted in 2010, that slightly extended the constexpr facility specifically so that function such as min and max could be made constexpr.

You can work around this by defining your own min and max functions:

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
风筝在阴天搁浅。 2024-12-07 18:54:03

这适用于 c++ 11

template<const Sz a,const Sz b> constexpr Sz staticMax() {return a>b?a:b;}

使用:

staticMax<a,b>()

当然 ab 必须是 constexpr

this works on c++ 11

template<const Sz a,const Sz b> constexpr Sz staticMax() {return a>b?a:b;}

use:

staticMax<a,b>()

and of course a and b must be constexpr

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文