[[nodiscard]] is a property introduced in C 17 to prompt the compiler to warn the situation where the function returns value is ignored. 1. Functions commonly used to return error codes, states or resource handles; 2. Can be used on function declarations, return types, enums or classes; 3. Use (void) to explicitly ignore the return value; 4. Mainstream compilers support but do not forcefully block compilation; 5. It is recommended to use key return values to affect program logic to avoid abuse.
[[nodiscard]]
is an attribute introduced in C 17 to tell the compiler that the return value of a certain function should not be ignored. If you call such a function but do not use its return value, the compiler will issue a warning.
![What is [[nodiscard]] attribute in C ?](https://img.php.cn/upload/article/000/000/000/175242944376379.jpeg)
This is very useful in actual development, especially when you design a function, the return value contains important information (such as error codes, status, results, etc.), and you do not want the caller to accidentally miss processing this information.
![What is [[nodiscard]] attribute in C ?](https://img.php.cn/upload/article/000/000/000/175242944543172.jpeg)
When should I use [[nodiscard]]
This property is most commonly used in the following situations:
- Functions return error codes or status, such as
std::expected
,std::optional
, or custom error structures. - The function returns a resource handle, such as lock objects, memory pointers, etc. If you do not use the return value, it may cause resource leakage.
- The function performs certain side effects operations, and the return value is the key basis for judgment.
For example:
![What is [[nodiscard]] attribute in C ?](https://img.php.cn/upload/article/000/000/000/175242944670929.jpeg)
[[nodiscard]] bool is_valid_config() { // Check whether the configuration is valid and return valid; }
If someone calls this: is_valid_config();
without checking the return value, the compiler will give a prompt.
How to use [[nodiscard]]
correctly
You can add this property to the function declaration or return type:
[[nodiscard]] int compute_value(); // Or put before the return type (more modern practice): int [[nodiscard]] compute_value();
It can also be used on enum types or classes, indicating that the values returned from these types should not be ignored either:
enum [[nodiscard]] error_code { success, file_not_found }; error_code read_file() { /* ... */ }
Note:
[[nodiscard]]
is just a property of the suggested nature. It does not prevent code from being compiled, but relies on the compiler to support and issue warnings. Mainstream compilers such as GCC, Clang and MSVC are all supported.
Common practices in actual development
Many standard and third-party libraries have begun to use this feature widely, such as:
-
std::optional<T>
constructor or member function. - type
std::expected
in<expected>
(C 23). - Functions returned by various states, such as network requests, file reading and writing, etc.
Some project specifications also require:
- All functions that return status code must be added with
[[nodiscard]]
- If the function return value may affect the program logic, it is also recommended to add
- Whether the return value of "pure function" needs to be added depends on the specific situation.
Tips and precautions
- If you really don't need to return values, you can use
(void)
to explicitly ignore them to avoid warnings:
(void)compute_value();
- Don't abuse it, for example, adding this property to a function that returns
int
representation length may not be appropriate. - You can use comments to explain why the return value cannot be ignored to improve maintainability.
Basically that's it. Use [[nodiscard]]
well to help you discover many bugs caused by negligence in advance.
The above is the detailed content of What is [[nodiscard]] attribute in C ?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

The core of PHP's development of AI text summary is to call external AI service APIs (such as OpenAI, HuggingFace) as a coordinator to realize text preprocessing, API requests, response analysis and result display; 2. The limitation is that the computing performance is weak and the AI ecosystem is weak. The response strategy is to leverage APIs, service decoupling and asynchronous processing; 3. Model selection needs to weigh summary quality, cost, delay, concurrency, data privacy, and abstract models such as GPT or BART/T5 are recommended; 4. Performance optimization includes cache, asynchronous queues, batch processing and nearby area selection. Error processing needs to cover current limit retry, network timeout, key security, input verification and logging to ensure the stable and efficient operation of the system.

Bit operation can efficiently implement the underlying operation of integers, 1. Check whether the i-th bit is 1: Use n&(1

Functions are the basic unit of organizing code in C, used to realize code reuse and modularization; 1. Functions are created through declarations and definitions, such as intadd(inta,intb) returns the sum of the two numbers; 2. Pass parameters when calling the function, and return the result of the corresponding type after the function is executed; 3. The function without return value uses void as the return type, such as voidgreet(stringname) for outputting greeting information; 4. Using functions can improve code readability, avoid duplication and facilitate maintenance, which is the basic concept of C programming.

decltype is a keyword used by C 11 to deduce expression types at compile time. The derivation results are accurate and do not perform type conversion. 1. decltype(expression) only analyzes types and does not calculate expressions; 2. Deduce the variable name decltype(x) as a declaration type, while decltype((x)) is deduced as x due to lvalue expression; 3. It is often used in templates to deduce the return value through tail-set return type auto-> decltype(t u); 4. Complex type declarations can be simplified in combination with auto, such as decltype(vec.begin())it=vec.begin(); 5. Avoid hard-coded classes in templates

C folderexpressions is a feature introduced by C 17 to simplify recursive operations in variadic parameter templates. 1. Left fold (args...) sum from left to right, such as sum(1,2,3,4,5) returns 15; 2. Logical and (args&&...) determine whether all parameters are true, and empty packets return true; 3. Use (std::cout

ABinarySearchTree(BST)isabinarytreewheretheleftsubtreecontainsonlynodeswithvalueslessthanthenode’svalue,therightsubtreecontainsonlynodeswithvaluesgreaterthanthenode’svalue,andbothsubtreesmustalsobeBSTs;1.TheC implementationincludesaTreeNodestructure

C's range-basedfor loop improves code readability and reduces errors by simplifying syntax. Its basic structure is for(declaration:range), which is suitable for arrays and STL containers, such as traversing intarr[] or std::vectorvec. Using references (such as conststd::string&name) can avoid copy overhead and can modify element content. Notes include: 1. Do not modify the container structure in the loop; 2. Ensure that the range is effective and avoid the use of freed memory; 3. There is no built-in index and requires manual maintenance of the counter. Mastering these key points allows you to use this feature efficiently and safely.

Calling Python scripts in C requires implementation through PythonCAPI. First, initialize the interpreter, then import the module and call the function, and finally clean up the resources; the specific steps are: 1. Initialize the Python interpreter with Py_Initialize(); 2. Load the Python script module with PyImport_Import(); 3. Obtain the objective function through PyObject_GetAttrString(); 4. Use PyObject_CallObject() to pass parameters to call the function; 5. Call Py_DECREF() and Py_Finalize() to release the resource and close the interpreter; in the example, hello is successfully called
