Quelles sont les règles pour l'instanciation de gabarit lorsque nous transmettons une classe (multi) dérivée à une fonction gabarit attendant une classe de base? Par exemple:instanciation de gabarit avec héritage de gabarit multiple
#include <iostream>
template <int x>
struct C {};
struct D : C<0>, C<1> {};
template <int x>
void f (const C<x> &y) { std::cout << x << "\n"; }
int main()
{
f (D());
}
MSVC 2015 0 impressions, clang 3,8 à 1 et gcc 6.2 donne erreur du compilateur (Demo). Et même si vous SFINAE emporter tous sauf un des surcharges, le résultat sera toujours différent:
#include <iostream>
template <int x> struct C {};
template<>
struct C<0> { using type = void; };
struct D : C<0>, C<1> {};
template <int x, typename = typename C<x>::type>
void f (const C<x> &y) { std::cout << x << "\n"; }
int main()
{
f (D());
}
Maintenant, il compile uniquement avec MSVC, et si vous échangez C<0>
et C<1>
seulement clang va compiler. Le problème est que MSVC essaye seulement d'instancier la première base, les erreurs d'impression clang-last et gcc trop tôt. Quel compilateur a raison?
me semble comme s'ils ont tous tort. Ne devrait-il pas être un appel de fonction ambigu? –
* "MSVC imprime 0, clang - 1 et gcc donne une erreur de compilation." *, Quel MSVC, quel gcc et quel clang? –
@PiotrSkotnicki Les numéros de version ajoutés, mais tous se comportent de la même manière –