atributo de C++: nodiscard
De cppreference.com
Si una función declarada nodiscard o una función que devuelve una enumeración o clase declarada nodiscard por valor se llama desde una expresión de valor descartado aparte de una conversión a void, se incentiva al compilador a emitir una advertencia.
Sintaxis
[[nodiscard]]
|
(1) | ||||||||
[[nodiscard( literal-de-cadena )]]
|
(2) | (desde C++20) | |||||||
| literal-de-cadena | - | Texto que podría usarse para explicar la justificación de por qué el resultado no debe descartarse. |
Explicación
Aparece en una declaración de función, declaración de enumeración o declaración de clase.
Si de una expresión de valor descartado que no sea una conversión a void:
- se llama a una función declarada
nodiscard, o - se llama a una función que devuelve una enumeración o clase declarada
nodiscardpor valor, o - un constructor declarado
nodiscardes llamado por conversión de tipo explícito o static_cast, o - un objeto de una enumeración o tipo de clase declarado
nodiscardse inicializa mediante una conversión de tipo explícita o static_cast,
se incentiva al compilador para que emita una advertencia.
El literal-de-cadena, si se especifica, generalmente se incluye en las advertencias.
|
(desde C++20) |
Ejemplo
Ejecuta este código
struct [[nodiscard]] info_de_error { };
info_de_error habilitar_modo_seguro_de_misil();
void lanzar_misiles();
void probar_misiles() {
habilitar_modo_seguro_de_misil(); // el compilador puede advertir si se
// descarta un valor nodiscard
lanzar_misiles();
}
info_de_error& foo();
void f1() {
foo(); // tipo nodiscard no se devuelve por valor, no hay advertencia
}
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| P1771R1 | C++17 | Atributo nodiscard en constructores no tiene efecto
|
Puede causar una advertencia si el objeto construido se descarta |
Biblioteca estándar
Las siguientes funciones estándar están declaradas con el atributo nodiscard:
Funciones de asignación de memoria | |
| Funciones de asignación. (función) | |
| Asigna almacenamiento no inicializado. (función miembro pública de std::allocator)
| |
[estático] |
asigna almacenamiento sin inicializar utilizando el asignador Original: allocates uninitialized storage using the allocator The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (función miembro estática pública de std::allocator_traits)
|
| Asigna memoria. (función miembro pública de std::pmr::memory_resource)
| |
| Asigna memoria. (función miembro pública de std::pmr::polymorphic_allocator<T>)
| |
asigna almacenamiento sin inicializar utilizando el asignador exterior Original: allocates uninitialized storage using the outer allocator The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (función miembro pública de std::scoped_allocator_adaptor)
| |
Acceso indirecto | |
(C++17) |
Barrera de optimización de puntero. (plantilla de función) |
(C++20) |
Informa al compilador que un puntero está alineado. (plantilla de función) |
Funciones de comprobación de vacío | |
(C++17) |
Comprueba si un contenedor está vacío (plantilla de función) |
| Comprueba si el controlador de nodo está vacío (función miembro pública de node handle)
| |
(C++11) |
Comprueba si el contenedor está vacío. (función miembro pública de std::array)
|
| Comprueba si la cadena está vacía (función miembro pública de std::basic_string)
| |
| Comprueba si la vista está vacía (función miembro pública de std::basic_string_view<CharT,Traits>)
| |
| Comprueba si el contenedor está vacío. (función miembro pública de std::deque<T,Allocator>)
| |
(C++11) |
Comprueba si el contenedor está vacío. (función miembro pública de std::forward_list)
|
| Comprueba si el contenedor está vacío. (función miembro pública de std::list)
| |
| Comprueba si el contenedor está vacío. (función miembro pública de std::map<Key,T,Compare,Allocator>)
| |
| Verifica si la coincidencia tuvo éxito. (función miembro pública de std::match_results<BidirIt,Alloc>)
| |
| Comprueba si el contenedor está vacío. (función miembro pública de std::multimap<Key,T,Compare,Allocator>)
| |
| Comprueba si el contenedor está vacío. (función miembro pública de std::multiset<Key,Compare,Allocator>)
| |
| Comprueba si el contenedor subyacente está vacío. (función miembro pública de std::priority_queue<T,Container,Compare>)
| |
| Comprueba si el contenedor subyacente está vacío. (función miembro pública de std::queue<T,Container>)
| |
| Comprueba si el contenedor está vacío. (función miembro pública de std::set<Key,Compare,Allocator>)
| |
| Comprueba si la secuencia está vacía (función miembro pública de std::span<T,Extent>)
| |
| Comprueba si el contenedor subyacente está vacío. (función miembro pública de std::stack<T,Container>)
| |
(C++11) |
Comprueba si el contenedor está vacío. (función miembro pública de std::unordered_map<Key,T,Hash,KeyEqual,Allocator>)
|
(C++11) |
Comprueba si el contenedor está vacío. (función miembro pública de std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator>)
|
(C++11) |
Comprueba si el contenedor está vacío. (función miembro pública de std::unordered_multiset<Key,Hash,KeyEqual,Allocator>)
|
(C++11) |
Comprueba si el contenedor está vacío. (función miembro pública de std::unordered_set<Key,Hash,KeyEqual,Allocator>)
|
| Comprueba si el contenedor está vacío. (función miembro pública de std::vector<T,Allocator>)
| |
| Comprueba si la ruta de acceso está vacía (función miembro pública de std::filesystem::path)
| |
Misceláneos | |
(C++11) |
Ejecuta una función asíncronamente (posiblemente en un nuevo hilo) y devuelve un std::future que contendrá el resultado. (plantilla de función) |