为什么在 std::max 的 libstdc++ 实现中避免了三元条件?
Why is a ternary conditional avoided in libstdc++ implementation of std::max?
在 <algorithm>
header 的 libstdc++ 实现中,我的系统中的一部分驻留在 /usr/include/c++/8/bits/stl_algobase.h
中,我可以看到 std::max
的以下实现:
template<typename _Tp>
_GLIBCXX14_CONSTEXPR
inline const _Tp&
max(const _Tp& __a, const _Tp& __b)
{
// concept requirements
__glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
//return __a < __b ? __b : __a;
if (__a < __b)
return __b;
return __a;
}
可以看到单条语句中的三元条件运算符?:
被注释掉了,取而代之的是基于if
的代码
我想这有一些技术原因。那么注释掉的版本会出什么问题而不是活动的版本呢?或者它们是否完全相同,活动版本只是让 step-by-step 调试更容易?
gcc 中存在条件运算符实现错误,例如 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53000。可能这是为了避免那些。
在 <algorithm>
header 的 libstdc++ 实现中,我的系统中的一部分驻留在 /usr/include/c++/8/bits/stl_algobase.h
中,我可以看到 std::max
的以下实现:
template<typename _Tp>
_GLIBCXX14_CONSTEXPR
inline const _Tp&
max(const _Tp& __a, const _Tp& __b)
{
// concept requirements
__glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
//return __a < __b ? __b : __a;
if (__a < __b)
return __b;
return __a;
}
可以看到单条语句中的三元条件运算符?:
被注释掉了,取而代之的是基于if
的代码
我想这有一些技术原因。那么注释掉的版本会出什么问题而不是活动的版本呢?或者它们是否完全相同,活动版本只是让 step-by-step 调试更容易?
gcc 中存在条件运算符实现错误,例如 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53000。可能这是为了避免那些。