Подтвердить что ты не робот

Возврат с помощью оператора assert и comma

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 в возвращении кажется мне довольно странным; Я бы написал это как:

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;
}

Тем не менее, я предполагаю, что они выбрали их реализацию по какой-то причине; есть ли преимущество их версии над "моей"?

4b9b3361

Ответ 1

В С++ 11 функции constexpr могут иметь только один оператор return (см. здесь). Предложенная реализация позволяет использовать эту функцию в компиляторе, совместимом с С++ 11.

С++ 14 удалил это ограничение, поэтому ваша реализация также действительна в С++ 14 или новее.

Не обращая внимания на это, функции в точности эквивалентны, и ваша определенно более читаема.