A
template <typename T>Метафункция
auto func(T&& t) -> make_u<T> {
return std::forward<T>(t);
}
make_u
преобразует тип T в U, неважно как. Для всех нужных T находится правильный U.Эта функция косвенно используется в другом месте для вычисления типа в другой функции. Она инстанцируется типом V. У типа V есть операция преобразования в
make_u<V>
без тела (только объявление).Теперь к сути. Я точно знаю, что инстанция func с V нужна только для меты, ее тело не нужно, вызов
func<V>
есть только в unevaluated контексте. Гцц этого не понимает и фэйлит линковку, кланг понимает. Что делать с гцц?