Почему std :: add_lvalue_reference работает не так, как ожидалось? - PullRequest
0 голосов
/ 08 декабря 2018
#include <type_traits>

template<typename T>
using Ref1 = T & ;

template<typename T>
using Ref2 = std::add_lvalue_reference_t<T>;

template<typename T>
void f1(Ref1<T>)
{}

template<typename T>
void f2(Ref2<T>)
{}

int main()
{
    int n{};
    f1(n); // ok
    f2(n); // error
}

Мой компилятор - Clang 7.0, скомпилированный с c++17.Сообщение об ошибке:

error : no matching function for call to 'f2'
  note: candidate template ignored:
        couldn't infer template argument 'T'

Почему f1 нормально, а f2 нет?

1 Ответ

0 голосов
/ 08 декабря 2018

std::add_lvalue_reference_t<T> определяется как typename std::add_lvalue_reference<T>::type, тогда для template<typename T> void f2(Ref2<T>), т. Е. template<typename T> void f2(typename std::add_lvalue_reference<T>::type), принадлежит невыбранный контекст , что вызывает сбой вывода аргумента шаблона.

В следующих случаях типы, шаблоны и нетипизированные значения, используемые для составления P, не участвуют в выводе аргументов шаблона, а вместо этого используют аргументы шаблона, которые были либо выведены в другом месте, либоявно указано.Если параметр шаблона используется только в не выводимых контекстах и ​​не указан явно, вывод аргумента шаблона завершается неудачно.

1) Спецификатор вложенного имени (все слева от оператора разрешения области действия: :)типа, указанного с помощью квалифицированного идентификатора:

...