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.
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.
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