C++ attribute: nodiscard (since C++17)
Si una función declarada
nodiscard
o una función que retorna una enumeración o clase declarada
nodiscard
por valor es llamada desde una
expresión de valor descartado
que no sea una conversión a
void
, se recomienda al compilador que emita una advertencia.
Contenidos |
Sintaxis
[
[
nodiscard
]
]
|
(1) | (desde C++17) | |||||||
[
[
nodiscard
(
literal-de-cadena
)
]
]
|
(2) | (desde C++20) | |||||||
| string-literal | - | un literal de cadena no evaluado que podría utilizarse para explicar la razón por la cual el resultado no debería descartarse |
Explicación
Aparece en una declaración de función, declaración de enumeración o declaración de clase.
Si, desde una expresión de valor descartado que no sea un cast 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 -
se llama a un constructor declarado
nodiscardmediante conversión explícita de tipo o static_cast , o -
se inicializa un objeto de tipo enumeración o clase declarado
nodiscardmediante conversión explícita de tipo o static_cast ,
se recomienda al compilador que emita una advertencia.
|
El string-literal , si se especifica, normalmente se incluye en las advertencias. |
(since C++20) |
Ejemplo
struct [[nodiscard]] error_info { /*...*/ }; error_info enable_missile_safety_mode() { /*...*/ return {}; } void launch_missiles() { /*...*/ } void test_missiles() { enable_missile_safety_mode(); // el compilador puede advertir al descartar un valor nodiscard launch_missiles(); } error_info& foo() { static error_info e; /*...*/ return e; } void f1() { foo(); } // el tipo nodiscard no se retorna por valor, sin advertencia // nodiscard( cadena-de-caracteres ) (desde C++20): [[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; } int main() { strategic_value(4, 2); // el compilador puede advertir al descartar un valor nodiscard auto z = strategic_value(0, 0); // OK: el valor de retorno no se descarta return z; }
Salida posible:
game.cpp:5:4: warning: ignoring return value of function declared with ⮠ 'nodiscard' attribute game.cpp:17:5: warning: ignoring return value of function declared with ⮠ 'nodiscard' attribute: PURE FUN
Biblioteca estándar
Las siguientes funciones estándar se declaran con el atributo
|
(hasta C++26) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| P1771R1 | C++17 |
[[nodiscard]]
en constructores no tiene efecto
|
puede generar una advertencia si el objeto construido es descartado |
Referencias
- Estándar C++23 (ISO/IEC 14882:2024):
-
- 9.12.9 Atributo Nodiscard [dcl.attr.nodiscard]
- Estándar C++20 (ISO/IEC 14882:2020):
-
- 9.12.8 Atributo Nodiscard [dcl.attr.nodiscard]
- Estándar C++17 (ISO/IEC 14882:2017):
-
- 10.6.7 Atributo Nodiscard [dcl.attr.nodiscard]
Véase también
|
(C++11)
|
marcador de posición para omitir un elemento al desempaquetar una
tuple
usando
tie
(constante) |
|
Documentación de C
para
nodiscard
|
|