объединение перегрузок const T& и T&&

У меня есть следующие две перегрузки шаблона функций:

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>&'

Как и вторая попытка:

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> >)'

Есть ли чистый способ унифицировать перегрузки, или я должен просто жить с ними?

6
задан fredoverflow 18 April 2012 в 14:54
поделиться