Проблема удержания типа шаблона - PullRequest
0 голосов
/ 04 августа 2011

У меня есть variant класс.У него есть пара конструкторов:

/// Construct and fill.
template <typename T>
inline
variant (const T& t)
{
  YYASSERT (sizeof (T) <= S);
  new (buffer.raw) T(t);
}

template <typename T>
inline
variant (T&& t)
{
  YYASSERT (sizeof (T) <= S);
  new (buffer.raw) T(std::move(t));
}

Теперь я назвал эти конструкторы в этом коде:

parser::symbol_type
parser::make_IDENTIFIER (const Wide::ParsedFile::Identifier*& v)
{
return symbol_type (token::IDENTIFIER, v);
}

symbol_type принимает variant в качестве второго аргумента в этомконкретный конструктор, и v неявно преобразуется.

Однако MSVC попытается использовать конструктор ссылок rvalue вместо использования другого конструктора, что приведет к ошибке компиляции при попытке new ссылки,Почему это так и как я могу остановить это?

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

Обычно вам не следует перегружать шаблонную функцию 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% уверен).

0 голосов
/ 04 августа 2011

Второй шаблон будет лучше соответствовать, потому что спецификаторы const находятся в разных местах вашей функции и в первом конструкторе.

При первой перегрузке T будет выводиться как

const Wide::ParsedFile::Identifier*

И затем создание константной ссылки на этот тип. Это добавляет дополнительную константу.

...