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
enthis
, lo que a su vez le permite hacerdecltype
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.