返回assert和逗号运算符

rai*_*ner 25 c++ c++17

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;
}
Run Code Online (Sandbox Code Playgroud)

虽然我确实理解这是如何工作的,但是把断言声明放在回报中对我来说似乎很奇怪; 我会把它写成:

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;
}
Run Code Online (Sandbox Code Playgroud)

不过,我猜他们之所以选择他们的实施是有原因的; 他们的版本优于"我的"吗?

Jos*_*and 38

在C++ 11中,constexpr函数只能有一个return语句(参见这里).建议的实现允许该函数在符合C++ 11的编译器中使用.

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

忽略这一点,功能完全相同,你的功能肯定更具可读性.

  • 不完全的.C++ 11要求`constexpr`函数只包含空语句(空`;`),`static_assert`,`typedef`和`using`声明,`using`指令和一个return语句(per [here](http) ://en.cppreference.com/w/cpp/language/constexpr)).不允许使用其他语句(如单独的`assert`). (7认同)
  • 即使将`assert`从`return`语句移出到它自己的行上,仍然只有一个`return`语句.那么,它不兼容C++ 11吗? (2认同)