Обычно вам не следует перегружать шаблонную функцию T&&
. Вместо этого у вас должна быть единственная функция, которая пересылает:
template <typename T>
inline
variant (T&& t)
{
typedef typename std::remove_reference<T>::type Tr;
YYASSERT (sizeof (Tr) <= S);
new (buffer.raw) Tr(std::forward<T>(t));
}
Это имеет функции двух ваших перегрузок, избегая при этом проблемы выбора неправильной.
Я полагаю (не положительно), что в вашем наборе перегрузки есть два варианта:
varaint<const Wide::ParsedFile::Identifier*>(const Wide::ParsedFile::Identifier*const&)
varaint<const Wide::ParsedFile::Identifier*&>(const Wide::ParsedFile::Identifier*&)
И второй выигрывает, потому что он более специализирован, чем первый (я делаю обоснованное предположение, я не на 100% уверен).