"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > L'analyse la plus vexante : Timer() - Appel d'objet ou de fonction ?

L'analyse la plus vexante : Timer() - Appel d'objet ou de fonction ?

Publié le 2024-12-21
Parcourir:152

The Most Vexing Parse: Timer() - Object or Function Call?

Analyse la plus vexante : lever l'ambiguïté en C 11

L'ambiguïté de "l'analyse la plus vexante" en C 11 se présente lors de l'utilisation d'initialiseurs uniformes, comme en témoigne l'extrait de code suivant :

#include 

class Timer
{
public:
    Timer() {}
};

int main()
{
    auto dv = Timer(); // Ambiguity: Object or function call?
    int time_keeper(Timer()); // Ambiguity: Pointer or call?
    return 0;
}

Comprendre la première expression (auto dv = Timer())

Dans la première expression, le mot-clé auto implique que le type de dv est déduit de l'initialiseur à droite du signe égal (=). L'initialiseur est un appel au constructeur Timer sans argument, qui renvoie un objet Timer. Par conséquent, dv est un objet de type Timer.

Comprendre la deuxième expression (int time_keeper(Timer()))

Dans la deuxième expression, l'ambiguïté surgit car le compilateur ne peut pas déterminer si Timer() est un appel de fonction ou un objet de type Timer passé par référence.

  • Si Timer() est un appel de fonction, alors int time_keeper(Timer()) déclare une fonction appelée time_keeper qui prend un objet Timer en entrée et renvoie un int.
  • Si Timer() est un objet de type Timer, alors int time_keeper(Timer()) déclare un fonction appelée time_keeper qui prend un pointeur vers un objet Timer en entrée et renvoie un int.

Cependant, comme les fonctions se désintègrent en pointeurs lorsqu'elles sont passées en arguments, le le vrai type de time_keeper est int(Timer(*)()), ce qui résout l'ambiguïté en faveur de l'interprétation pointeur vers fonction.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3