What is good about using [[maybe_unused]]
?
Consider
int winmain(int instance, int /*prevInstance*/, const char */*cmdline*/, int show);
int win
Baum mit Augen's answer is the definitive and undisputed explanation. I just want to present another example, which doesn't require macros. Specifically, C++17 introduced the constexpr if
construct. So you may see template code like this (bar the stupid functionality):
#include <type_traits>
template<typename T>
auto add_or_double(T t1, T t2) noexcept {
if constexpr (std::is_same_v<T, int>)
return t1 + t2;
else
return t1 * 2.0;
}
int main(){
add_or_double(1, 2);
add_or_double(1.0, 2.0);
}
As of writing this, GCC 8.0.1 warns me about t2
being unused when the else branch is the instantiated one. The attribute is indispensable in a case like this too.
If the parameter is definitely unused, [[maybe_unused]]
is not particularly useful, unnamed parameters and comments work just fine for that.
[[maybe_unused]]
is mostly useful for things that are potentially unused, like in
void fun(int i, int j) {
assert(i < j);
// j not used here anymore
}
This can't be handled with unnamed parameters, but if NDEBUG
is defined, will produce a warning because j
is unused.
Similar situations can occur when a parameter is only used for (potentially disabled) logging.