Pages

samedi 9 mars 2013

Petite curiosité de volatile

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:

Blanchet Florian a dit…

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.