36 votes

La nouvelle syntaxe de retour C++ est-elle limitée ?

J'ai commencé un nouveau projet privé et j'ai décidé d'utiliser plus de C++11 / 14 cette fois-ci. J'ai donc commencé à utiliser la nouvelle syntaxe de retour

auto functionName() -> returnType;

Cela fonctionne en grande partie très bien, mais j'ai maintenant besoin de gérer les erreurs et je n'ai pas trouvé comment réécrire ce genre de choses :

virtual const char* what() const noexcept override;

avec la nouvelle syntaxe. Y a-t-il des cas où la nouvelle syntaxe ne peut pas être utilisée ou suis-je seulement pas assez intelligent pour trouver le bon ordre ? Pour moi, il est important de garder les choses cohérentes, donc j'espère que le problème est plutôt de mon côté.

37voto

Peter Points 4026

La raison de ce problème est que noexcept fait partie du déclarateur de fonction (et est proposé pour faire partie du type de fonction en C++17), tandis que override est un identifiant (facultatif) qui ne fait pas partie du déclarant de la fonction.

Par conséquent, sans l'utilisation de override la déclaration serait

virtual auto what() const noexcept -> const char *;

et, étant donné que override doit apparaître après cette déclaration, il en résultera

virtual auto what() const noexcept -> const char * override;

Cela dit, plutôt que d'utiliser servilement les fonctionnalités de C++11/C++14, choisissez celles qui reflètent le mieux votre intention. Il n'existe pas de règle imposant l'utilisation exclusive des fonctionnalités de C++11/C++14 s'il existe des alternatives plus anciennes permettant de réaliser la même chose.

37voto

Oui, ce n'est pas quelque chose que l'on devine normalement.

virtual auto what() const noexcept -> const char * override;

Il s'agit simplement de l'ordre à suivre. La syntaxe aurait probablement pu être différente, mais c'est ce que nous avons obtenu.

21voto

HolyBlackCat Points 2137

La nouvelle syntaxe prend en charge tout ce que fait l'ancienne syntaxe.

virtual const char* what() const noexcept override;

doit être réécrite comme suit

virtual auto what() const noexcept -> const char * override;

En fait, la nouvelle syntaxe prend en charge encore plus de fonctionnalités :

  • Il vous permet de faire decltype sur les arguments des fonctions.

    template <typename A, typename B> auto plus(A a, B b) -> decltype(a+b)
    {
        return A + B;
    }
  • Il vous permet également de faire decltype en this qui, à son tour, vous permet de faire decltype sur les fonctions membres. Voir cela.

    struct S
    {
        int a() {return 1;}
        auto b() -> decltype(a()) {return 2;} // Works.
        decltype(a()) c() {return 2;} // ERROR.
    };

Mais bien que la nouvelle syntaxe dispose de toutes ces fonctionnalités supplémentaires, il n'est pas censé remplacer l'ancien. C'est du moins ainsi que je le comprends.

Certains programmeurs préfèrent l'utiliser, mais pour autant que je sache, la plupart des programmeurs ici sur Stack Overflow préfèrent utiliser l'ancienne syntaxe lorsque c'est possible.

1voto

Stephen Rogers Points 21

Puisque vous vous êtes renseigné sur C++14 également, pour votre scénario, cette syntaxe est meilleure que la syntaxe du type de retour suffixe ;

virtual auto what() const noexcept override;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X