このフォームの例をよく目にします。
template <typename T, typename U>
auto add(T&& t, U&& u) -> decltype(std::forward<T>(t) + std::forward<U>(u))
{
return std::forward<T>(t) + std::forward<U>(u);
}
しかし、私はあえてこれがより正しい方法であると言います:
template <typename T, typename U>
auto add(T&& t, U&& u) -> decltype(t + u)//no forwarding here
{
return std::forward<T>(t) + std::forward<U>(u);
}
なんで?何よりもまず、この例のdecltypeはリターンタイプを推測するだけでよいので、(t + u)はリターンタイプではなく(std :: forward(t)+ std :: forward(u))、2つのverによって生成される2番目のコードは同一であり、3番目のdecltype(u + t)はより直接的であり、実装の「根性」を引き出すことなく、プログラマーの意図が何であるかを正確に表現します。
このテーマについてどう思いますか?