C ++ 17 introduce el [[nodiscard]]
atributo, que permite a los programadores marcar funciones de manera que el compilador produzca una advertencia si el llamador descarta el objeto devuelto; se puede agregar el mismo atributo a un tipo de clase completo.
He leído sobre la motivación de esta característica en la propuesta original , y sé que C ++ 20 agregará el atributo a funciones estándar como std::vector::empty
, cuyos nombres no transmiten un significado inequívoco con respecto al valor de retorno.
Es una característica genial y útil. De hecho, casi parece demasiado útil. En todas partes sobre las que leo [[nodiscard]]
, las personas lo discuten como si simplemente lo agregaran a algunas funciones o tipos seleccionados y se olvidaran del resto. Pero, ¿por qué un valor no descartable debería ser un caso especial, especialmente al escribir código nuevo? ¿No es un valor de retorno descartado típicamente un error o al menos una pérdida de recursos?
¿Y no es uno de los principios de diseño de C ++ que el compilador debería detectar tantos errores como sea posible?
Si es así, ¿por qué no agregar [[nodiscard]]
su propio código no heredado a casi todas las void
funciones que no funcionan y casi todos los tipos de clase?
Intenté hacer eso en mi propio código, y funciona bien, excepto que es tan terriblemente detallado que comienza a sentirse como Java. Parecería mucho más natural hacer que los compiladores adviertan sobre los valores de retorno descartados por defecto, excepto en los pocos otros casos en los que marca su intención [*] .
Como no he visto ninguna discusión sobre esta posibilidad en las propuestas estándar, entradas de blog, preguntas de Stack Overflow o en cualquier otro lugar de Internet, me falta algo.
¿Por qué esa mecánica no tendría sentido en el nuevo código C ++? ¿Es la verbosidad la única razón para no usar [[nodiscard]]
casi en todas partes?
[*] En teoría, es posible que tengas algo así como un [[maydiscard]]
atributo, que también podría agregarse retroactivamente a funciones como printf
en implementaciones de biblioteca estándar.
const
puede hinchar una clase de otra manera "simple" (o más bien "objeto viejo y simple de datos") considerablemente en C ++.
std::vector
o std::unique_ptr
, de las cuales solo necesita miembros de datos en su definición de clase. He trabajado con ambos idiomas; Java es un lenguaje aceptable, pero es más detallado.
operator =
por ejemplo. Ystd::map::insert
.