次の2つの関数テンプレートのオーバーロードがあります。
template<typename T>
optional<T> some(const T& x)
{
return optional<T>(x);
}
template<typename T>
typename std::enable_if<std::is_rvalue_reference<T&&>::value, optional<T> >::type
some(T&& x)
{
return optional<T>(std::move(x));
}
完全な転送を介して過負荷を統合する最初の試みは失敗しました:
template<typename T>
optional<T> some(T&& x)
{
return optional<T>(std::forward<T>(x));
}
error: forming pointer to reference type 'const std::basic_string<char>&'
私の2回目の試みと同じように:
template<typename T>
optional<typename std::remove_reference<T>::type> some(T&& x)
{
return optional<typename std::remove_reference<T>::type>(std::forward<T>(x));
}
error: no matching function for call to
'std::basic_string<char>::basic_string(gpa::optional<const std::basic_string<char> >)'
過負荷を統一するためのクリーンな方法はありますか、それとも私はそれらを持って生きるべきですか?