[[deprecated]]
is another attribute that is useful to mark something (a function, a method, a variable, a class, etc.) as still valid, but that has been superseded by other newer stuff and that probably will be removed in the future.
In a similar vein to [[nodiscard]]
, [[deprecated]]
can return a message explaining why this entity has been marked as such.
The compiler will show a warning when a deprecated entity is being actually used in our code.
For example, I have this code:
#include <iostream>
void print(const std::string& msg)
{
std::cout << msg << "\n";
}
int main()
{
print("Hello world");
}
After that a lot of functions and code started to use my print()
function, I realize that a newer version with std::string_view
instead of std::string
could have better performance and, since I do not want to break any code, I consider having both functions in my system.
So, to discourage the usage of my old function, I mark it as deprecated:
#include <iostream>
void println(std::string_view msg)
{
std::cout << msg << "\n";
}
[[deprecated("Use println instead")]]
void print(const std::string& msg)
{
std::cout << msg << "\n";
}
int main()
{
print("Hello world");
}
But, since I am still using the old version in my main()
function, the compiler will return a warning like this one:
main.cpp:17:24: warning: ‘void print(const string&)’ is deprecated: Use println instead [-Wdeprecated-declarations]
That will dissappear when I will replace all the invocation to print()
with println()
.