Maison  >  Article  >  développement back-end  >  Pourquoi la conversion de type implicite échoue-t-elle dans la déduction de modèle ?

Pourquoi la conversion de type implicite échoue-t-elle dans la déduction de modèle ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-31 19:31:30303parcourir

 Why Does Implicit Type Conversion Fail in Template Deduction?

Conversion de type implicite dans la déduction de modèle

En C, le mécanisme de conversion de type implicite joue un rôle crucial dans la déduction des arguments de modèle. Cependant, dans certains scénarios, cela peut conduire à un comportement inattendu, comme illustré par l'extrait de code ci-dessous :

<code class="cpp">#include<iostream>
using namespace std;

template<typename Dtype>
class Scalar{
public:
  Scalar(Dtype v) : value_(v){}
private:
  Dtype value_;
};

template<typename Dtype>
void func(int a, Scalar<Dtype> b){ 
  cout << "ok" << endl;
}

int main(){
  int a = 1;
  func(a, 2); // Incorrect conversion
  //int b = 2;
  //func(a, b); // Also incorrect
  return 0;
}

Dans le code fourni, l'objectif est d'invoquer la fonction modèle func en convertissant implicitement un int en un Scalaire objet. Cependant, étonnamment, le code ne parvient pas à se compiler en raison de l'échec de la déduction/substitution des arguments du modèle lors du premier appel à func(a, 2).

La raison derrière cet échec est que la déduction des arguments du modèle ne prend pas en compte l'utilisateur. conversions définies. Dans ce scénario, la conversion de int en Scalar est une conversion définie par l'utilisateur, qui n'est pas automatiquement appliquée lors de la déduction des arguments du modèle.

Pour résoudre ce problème, il existe plusieurs options :

  • Conversion explicite sur le site de l'appelant : Forcez la conversion en fournissant manuellement un Scalar objet avec la valeur souhaitée sur le site d'appel :

    <code class="cpp">func(a, Scalar<int>{2}); </code>
  • Guide de déduction : Définir un guide de déduction pour Scalar et call func :

    <code class="cpp">func(a, Scalar{2}); // C++17 only</code>

    Cette approche s'appuie sur le guide de déduction par défaut, qui est suffisant dans ce cas.

  • Instanciation explicite : Instanciez explicitement le modèle func pour le type souhaité :

    <code class="cpp">func<int>(a, 2); </code>

    Cela ne fonctionne que si Scalar::Scalar(T) n'est pas explicite.

En conclusion, la déduction des arguments du modèle n'applique pas automatiquement l'utilisateur -conversions définies. Pour utiliser des conversions définies par l'utilisateur dans la déduction d'argument de modèle, il est nécessaire soit de convertir explicitement l'argument sur le site appelant, d'utiliser un guide de déduction le cas échéant, soit d'instancier explicitement le modèle pour le type souhaité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn