C++17 adds a new attribute called [[nodiscard]]
to let the user know that a return value from a function or method should be handled properly or assigned to a value.
For example, look to this code:
int sum(int a, int b)
{
return a + b;
}
int main()
{
sum(10, 20);
return 0;
}
It produces no result or side-effects, but if the programmer forgot assigning the return value to a variable by mistake, the error will not be immediately obvious.
Now, in this scenario:
char* getNewMessage()
{
char* nm = new char[100];
strcpy(nm, "Hello world");
return nm;
}
int main()
{
getNewMessage();
return 0;
}
There is a memory leak produced because the returned value was not stored anywhere and there is no way to deallocate its memory.
Marking a function or method with [[nodiscard]]
, encourages the compiler to show a compilation warning when it is invoked and its return value is simply bypassed.
You can also write an additional message with the [[nodiscard]]
attribute. That message will be displayed if a warning is generated.
In my examples, we could mark my functions like this:
#include <cstring>
[[nodiscard]]
int sum(int a, int b)
{
return a + b;
}
[[nodiscard("Release the memory using delete[]")]]
char* getNewMessage()
{
char* nm = new char[100];
strcpy(nm, "Hello world");
return nm;
}
int main()
{
sum(10, 20);
getNewMessage();
return 0;
}
And in this case, g++ returns the following compilation warnings:
In function 'int main()':
<source>:19:6: warning: ignoring return value of 'int sum(int, int)', declared with attribute 'nodiscard' [-Wunused-result]
<source>:20:16: warning: ignoring return value of 'char* getNewMessage()', declared with attribute 'nodiscard': 'Release the memory using delete[]' [-Wunused-result]
Though using it could add a lot of verbosity to your method declarations, it is a good idea using it because it prevents some errors to occur.
More on [[nodiscard]]
: https://en.cppreference.com/w/cpp/language/attributes