Voici une petite curiosité du mot clef volatile.
#include <iostream>
struct S{};
void f(void*) { std::cout << 'p'; }
void f(bool) { std::cout << 'b'; }
int main()
{
S s;
volatile S * p1 = &s;
S * p2 = &s;
f(p1);
f(p2);
}
Résultat: bp
Le pointeur volatile passe dans la fonction demandant un booléen. Ce n'aurait pas été le cas si un prototype avec volatile void *
ou templater sur un _T*
existait.
1 commentaire:
Bonjour,
Tu observes ici l'algorithme de sélection des surcharges.
Dans le cas où tu as volatile, il n'y a qu'une seul surcharge qui est possible (il n'y a pas de conversion implicite de volatile T* à void*), c'est donc elle qui est appelé.
Dans le cas où tu n'as pas volatile, les deux surcharges sont possible, l'algorithme de sélection prend ici cette avec void*, la conversion implicite vers bool est la "moins forte" des conversions implicite.
Enregistrer un commentaire