2017-04-05 36 views
24

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

虽然我理解它是如何工作的,把断言语句的回报似乎很奇怪,我;我会写它:

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

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

+0

我有时使用逗号技巧,当我有一系列的声明,并且需要采取一些必要的步骤。 'a a =任何; B b =(命令式(a),whatever_else(a)); C c = ...'。也就是说,在C90代码中,我们没有混合声明和声明。 – Kaz

回答

38

在C++ 11中,constexpr函数只能有一个返回语句(请参阅here)。建议的实现允许将函数用于符合C++ 11的编译器。

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

忽视这一点,这些功能是完全等价的,而你的一个更可读。

+2

即使'assert'被移出return语句到它自己的行,仍然只有一个'return'语句。那么,它不会与C++ 11兼容吗? – Steve

+7

不完全。 C++ 11要求'constexpr'函数只包含空语句(空'''''''static_assert'''' typedef''''''''声明''使用'指令和一个return语句(per [here](http ://en.cppreference.com/w/cpp/language/constexpr))。其他语句(如独立的'assert')是不允许的。 – hlt

+0

即使在NDEBUG == 1时,断言是否必须是有效的*表达式?它不能扩展空使声明不能编译? – gigabytes