単純な数学関数を実装したいとします。たとえば、 (C++17's) の再実装であるとしますstd::clamp
。この関数は、数値、下限、および上限を取り、それらが定義する範囲外の場合、数値をそれらの境界の 1 つに設定します。具体的な数値型の場合、たとえばint
、次のように記述します。
constexpr int clamp(int x, int lower_bound, int upper_bound)
{
return x < lower_bound ? lower_bound : ( upper_bound < x ? upper_bound : x );
}
しかし、それがテンプレートの場合、おそらく標準で使用されるサンプル実装const&
では、値ではなく が使用されていることがわかります。したがって、引用を簡単にするために、次のようにします。
template <typename T>
constexpr T clip(const T& x, const T& lower_bound, const T& upper_bound)
{
return x < lower_bound ? lower_bound : ( upper_bound < x ? upper_bound : x );
}
私の質問は次のとおりです。
T
単純な数値型であるに対して const 参照を使用する利点はありますか?- 同上、単一の数値をデータメンバーとしてラップする抽象的なものである型(たとえば、
std::chrono
期間)の場合は? const&
比較的単純な(constexpr?)、副作用のない数学的な関数の一般的なケースで、値を取る方が(そしてまったく)良い考えなのはなぜですか?
ノート:
const&
たとえば、ある種の k 次元のベクトル型、またはboost::rational
s やその他の数値のような型がある場合、 a を使用することが理にかなっていることに気付きました。それでも、コンパイラはコピーを最適化しないでしょうか?- 私は、任意の C++ 関数について質問しているわけではなく、そのパラメーターを値で受け取るだけでよいかどうかを尋ねているわけではありません。それは明らかに悪い考えです。