sintaxis resueltos programas paso nomenclatura ejercicios ejemplos completo comandos c++ c++11 return

resueltos - ¿La nueva sintaxis de retorno de C++ es limitada?



manual completo de c++ pdf (4)

Comencé un nuevo proyecto privado y decidí usar más C++11 14 esta vez. Así que también comencé a usar la nueva sintaxis de retorno

auto functionName() -> returnType;

Funciona en su mayor parte muy bien, pero ahora necesitaba un manejo de errores y no pude encontrar la manera de volver a escribir cosas como esta:

virtual const char* what() const noexcept override;

con la nueva sintaxis ¿Hay algunos casos en que la nueva sintaxis no se puede utilizar o solo no soy lo suficientemente inteligente como para encontrar el orden correcto? Para mí es importante mantener las cosas consistentes, así que espero que el problema esté más de mi parte.


Dado que también preguntó sobre C ++ 14, para su escenario, esto es mejor que la sintaxis del tipo de retorno del sufijo;

virtual auto what() const noexcept override;


El motivo del problema es que noexcept forma parte del declarador de funciones (y se propone que forme parte del tipo de función en C ++ 17), mientras que la override es un identificador (opcionalmente utilizado) que no forma parte del declarador de funciones.

Por lo tanto, sin el uso de override la declaración sería

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

y, dado que la override debe aparecer después de esta declaración, dará como resultado

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

Dicho esto, en lugar de utilizar servilmente las funciones de C ++ 11 / C ++ 14, elija las que mejor reflejen su intención. No hay una regla que requiera solo el uso de las características de C ++ 11 / C ++ 14 si existen alternativas más antiguas para lograr lo mismo.


La nueva sintaxis admite todo lo que hace la sintaxis antigua.

virtual const char* what() const noexcept override;

debe ser reescrito como

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

En realidad, la nueva sintaxis admite aún más funciones:

  • Le permite hacer decltype en los argumentos de la función.

    template <typename A, typename B> auto plus(A a, B b) -> decltype(a+b) { return A + B; }

  • También le permite hacer decltype en this , lo que a su vez le permite hacer decltype en las funciones de miembro. Mira esto.

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

Pero mientras que la nueva sintaxis tiene todas esas características adicionales, no se supone que sea un reemplazo de la anterior. Al menos así es como lo entiendo.

Algunos programadores prefieren usarlo, pero hasta donde yo sé, la mayoría de los programadores aquí en prefieren usar la sintaxis anterior cuando sea posible.


Sí, esto no es algo que normalmente adivinarías.

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

Este es solo el orden que tienes que usar. La sintaxis podría haber sido diferente, probablemente, pero esto es lo que tenemos.