2017-04-05 59 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