戻り

2017-04-05 7 views
24

http://en.cppreference.com/w/cpp/algorithm/clampstd::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; 
} 

まだ、彼らは理由のために彼らの実装を選んだと思っています。彼らのバージョンが「私のもの」よりも有利なのでしょうか?

+0

私は、一連の宣言があるときにカンマを使うことがあり、命令的なステップを取る必要があります。 'Aは=何でも; B b =(命令的(a)、whatever_else(a)); C c = ... 'である。つまり、C90コードでは、宣言とステートメントが混在していません。 – Kaz

答えて

38

C++ 11では、constexpr関数は1つのreturn文しか持てませんでした(here参照)。提案された実装では、関数をC++ 11準拠のコンパイラで使用することができます。

C++ 14ではこの制限が削除されているため、実装はC++ 14以降でも有効です。

これを無視して、関数は完全に同等であり、あなたの関数は確かに読みやすくなっています。

+2

'assert'が' return'文からそれ自身の行に移動されたとしても、依然として 'return'文が1つしかありません。だから、C++ 11と互換性がないでしょうか? – Steve

+7

C++ 11では、 'constexpr'関数は空文(空文字'; ')、' static_assert'、 'typedef'と' using'宣言、 'using'指令と1つのreturn文([ここではhttp ://en.cppreference.com/w/cpp/language/constexpr))。他のステートメント(別の 'assert'のようなもの)は許されません。 – hlt

+0

NDEBUG == 1の場合でも、assertは有効な*式*である必要がありますか?文がコンパイルされないように空を展開できませんでしたか? – gigabytes