Соответствие c ++ использует decltype, чтобы помочь при выводе шаблона? - PullRequest
1 голос
/ 26 февраля 2020

Учитывая эти две функции:

template <typename T> void Print1( const T& aValue, const T& aDefaultValue )
{
    if( aValue != aDefaultValue ) std::cout << aValue << std::endl;
}

template <typename T> void Print2( const T& aValue, const decltype(aValue)& aDefaultValue )
{
    Print1<T>( aValue, aDefaultValue );
}

Я вижу, что почти в g cc 9 тип удержания работает всегда на Print2, но не на Print1

unsigned int i = 0;
Print1( i, 0 ); // dont work (cant do type deduction)
Print2( i, 0 ); // work

Это decltype методика с ++ соответствия и почему?

1 Ответ

4 голосов
/ 26 февраля 2020

С template_argument_deduction , в недедуцированных контекстах:

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

[..]

2) Выражение спецификатора decltype:

То есть в

template <typename T> void Print2(const T& aValue, const decltype(aValue)& aDefaultValue)

тип aDefaultValue не подлежит вычету. T выводится только из aValue.

В C ++ 20 альтернативой является использование std::type_identity:

template <typename T>
void Print2(const T& aValue, std::type_identity_t<const T&> aDefaultValue);
...