В соответствии со Стандартом C ++ 03 этот код некорректен, потому что вывод аргумента шаблона не сможет вывести X&
или X const&
против const double
.
C ++ 03 пропущено, чтобы утверждать, что ссылка отбирается из возвращаемого типа функции преобразования до вычета, поэтому вы никогда не сможете получить совпадение в вашем случае.Для C ++ 0x это будет исправлено и включено в последний рабочий документ, поэтому может компилироваться с некоторыми компиляторами, которые включают исправление задним числом.
Ваш код на самом деле имеет другую проблему: GCC реализует реализацию этого отчета о дефектах и, следовательно, сравнивает double
(он удаляет cv-квалификаторы до вывода!) против X
и против X const
.Только X
соответствует и, следовательно, только первая функция преобразования является единственным кандидатом в вызове с аргументом const Pack<8>
- поэтому GCC жалуется на отсутствие const
в функции преобразования.Если вы попробуете следующий код, он будет работать
// can't strip cv-qualifiers off "double const&" - there are no top-level
// cv qualifiers present here!
double const &d(p);