• [^] # Re: Syntaxe étonnante

    Posté par (site web personnel) . En réponse au journal C++Now 2014. Évalué à 10.

    Bon finalement j'ai trouvé. Pour ceux qui se posent aussi la question, il s'agit de la nouvelle syntaxe C++11 de déclaration de fonctions, où le type de retour est indiqué après la flèche et le nom est précédé du mot clé auto.

    Ici la déclaration de G::f est équivalente à

    class G {
    public:
     void f() {
     // ...
     }
    };

    Comme le type de retour (nommé trailing return type) est indiqué après la fonction, il est interprété dans le contexte de la fonction. Par exemple (inspiré de cette source), si j'écris

    class C {
    public:
     enum E { a, b, c };
     E f();
     auto g() -> E;
    };

    Je dois implémenter C::f en préfixant le type de retour avec le nom de la classe :

    C::E C::f() {
     // ...
    }

    Tandis que la nouvelle syntaxe m'épargne ce préfixe pour C::g :

    auto C::g() -> E {
     // ...
    }

    Ici le type de retour est bien C::E, c'est à dire E interprété dans le contexte de C.

    C'est super car j'ai économisé l'écriture de C:: au prix de l'écriture de auto -> ! Je ne me suis pas fait avoir...

    En fait l'intérêt est surtout lié à l'arrivée de decltype. On peut ainsi déclarer le type de retour en fonction des entités apparaissant dans la signature de la fonction, comme dans l'exemple suivant :

    template<class T, class U>
    auto add(T t, U u) -> decltype(t + u);

    Ici la fonction add retourne une valeur du même type que le résultat de operator+ sur les paramètres. Si T et U sont int, alors le type de retour est int ; si T est int et U est double, le type de retour est double.

    Une troisième source sur le sujet.