C++11: static_assert() 中的 std::max(a,b)?
我注意到,在最后一个 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是正确的。
我想原因很简单,
std::max
为任意类型T
和std:调用
为T::operator<
: :maxconstexpr
,则需要T::operator<
为constexpr
,这是未知的。That is correct.
I imagine the reason is simply that
std::max
callsT::operator<
for an arbitrary typeT
and forstd::max
to beconstexpr
, it would requireT::operator<
to beconstexpr
, which is unknown.这是正确的;
std::min
和std::max
不是constexpr
,甚至在 C++14 的最新草案中也不是 (N3690),因此无法使用它们在常量表达式中。这没有什么好的理由,只有不好的理由。最重要的糟糕原因是,C++ 委员会由在标准化方面工作的时间有限的个人组成,而且还没有人投入制作这些函数
constexpr
所需的工作。请注意N3039,对2010 年采用的 C++ 标准,专门稍微扩展了
constexpr
功能,以便可以使用min
和max
等函数制作了constexpr。您可以通过定义自己的
min
和max
函数来解决此问题:This is correct;
std::min
andstd::max
are notconstexpr
, 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 asmin
andmax
could be madeconstexpr
.You can work around this by defining your own
min
andmax
functions:这适用于 c++ 11
使用:
当然
a
和b
必须是constexpr
this works on c++ 11
use:
and of course
a
andb
must beconstexpr