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
?
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.
deixe-me dizer algumas palavras