Return 带有断言和逗号运算符

Return with assert and comma operator

http://en.cppreference.com/w/cpp/algorithm/clamp 将此作为 std::clamp 的可能实现:

template<class T, class Compare>
constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp )
{
    return assert( !comp(hi, lo) ),
        comp(v, lo) ? lo : comp(hi, v) ? hi : v;
}

虽然我确实理解这是如何工作的,但将 assert 语句放在 return 中对我来说似乎很奇怪;我会把它写成:

template<class T, class Compare>
constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp )
{
    assert( !comp(hi, lo) );
    return comp(v, lo) ? lo : comp(hi, v) ? hi : v;
}

不过,我猜他们选择实施是有原因的;他们的版本比 "mine" 有优势吗?

在 C++11 中,constexpr 函数只能有一个 return 语句(参见 here)。建议的实现允许函数在 C++11 兼容编译器中使用。

C++14 删除了此限制,因此您的实现在 C++14 或更高版本中也有效。

不管这个,功能完全等同,你的可读性肯定更好。