Dedução do argumento da função de modelo com uma conversão implícita

enferrujado

Eu entendo que a dedução do argumento da função de modelo não leva em consideração as conversões implícitas.

Portanto, este código não compila:

#include <iostream>

template<class T>
struct A {};
struct B : public A<int> {};
struct C {
  operator B() { return {}; }
};

template<class X>
void test(A<X> arg1, A<X> arg2) {
  std::cout << "ok1";
}

int main() {
  B b;
  C c;
  test(b, c);  // error: no matching function for call to 'test'
}

O que não entendo é como adicionar um nível extra de indireção com uma identidadetypedef faz com que funcione:

#include <iostream>

template<class T>
struct A {};
struct B : public A<int> {};
struct C {
  operator B() { return {}; }
};

template<typename U> struct magic { typedef U type; };

template<class T> using magic_t = typename magic<T>::type;

template<class X>
void test(A<X> arg1, A<X> arg2) {
  std::cout << "ok1";
}

template<class X>
void test(A<X> arg3, magic_t<A<X>> arg4) {
  std::cout << "ok2";
}

int main() {
  B b;
  C c;
  test(b, c);  // prints "ok2"
}

Demonstração ao vivo no Godbolt

Como magic_t<A<X>>acaba combinando C?

Igor Tandetnik

O segundo parâmetro se torna o contexto não deduzido e não participa da dedução do argumento do modelo. Xé então deduzido com sucesso do primeiro argumento.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Existe uma maneira de forçar a conversão implícita na dedução de argumento do modelo de função?

Implicações da dedução do argumento do modelo de função de conversão em C ++

Dedução de argumento do modelo de função com operador de conversão definido pelo usuário

Por que a conversão implícita de tipo não funciona na dedução do modelo?

Use guias de dedução na conversão implícita do argumento

A dedução / substituição do argumento do modelo falhou com lambda como ponteiro de função

dedução do argumento do modelo de função std ::

Dedução de argumento de modelo com classe de modelo dentro da classe de modelo

C ++ - dedução do modelo da função de conversão, por que isso funciona?

C ++ - dedução do modelo da função de conversão, por que isso funciona?

A dedução do argumento do modelo de classe não funciona com o modelo de alias

Forçando C ++ a preferir uma sobrecarga com uma conversão implícita em vez de um modelo

Instanciação implícita do argumento da função

Dedução de argumento do modelo de função (modelo de classe vs função)

dedução de argumento de modelo de modelo com sfinae

A substituição do argumento do modelo falha e a conversão implícita não é feita

Dedução do tipo de argumento do modelo pelo operador de conversão

Dedução do tipo de argumento do modelo de dentro da definição de classe

Chamar uma função com um argumento implicitamente conversível em um objeto da classe de modelo

Como a dedução do tipo de modelo funciona com uma função sobrecarregada como parâmetro

Como a dedução do tipo de modelo funciona com uma função sobrecarregada como parâmetro

Confuso com a dedução do argumento do modelo

A dedução do argumento do modelo falhou com typedef?

Template C ++; Tipo de retorno de dedução automática da função passada como argumento do modelo;

A dedução do modelo falha com o argumento após o pacote de parâmetros

É possível uma dedução de argumento de modelo 'profunda'?

É possível uma dedução de argumento de modelo 'profunda'?

Dedução de argumento de modelo para par implícito

Dedução de argumento de modelo para par implícito

TOP lista

quentelabel

Arquivo