Возврат с помощью оператора 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;
}
Тем не менее, я предполагаю, что они выбрали их реализацию по какой-то причине; есть ли преимущество их версии над "моей"?
Ответы
Ответ 1
В С++ 11 функции constexpr
могут иметь только один оператор return (см. здесь). Предложенная реализация позволяет использовать эту функцию в компиляторе, совместимом с С++ 11.
С++ 14 удалил это ограничение, поэтому ваша реализация также действительна в С++ 14 или новее.
Не обращая внимания на это, функции в точности эквивалентны, и ваша определенно более читаема.