Когда следует использовать [[maybe_unused]]?
Что хорошего в использовании [[maybe_unused]]
? Рассматривать
int winmain(int instance, int /*prevInstance*/, const char */*cmdline*/, int show);
int winmain(int instance, [[maybe_unused]] int prevInstance, [[maybe_unused]] const char *cmdline, int show);
Некоторые могут настаивать на том, что использование комментариев является уродливым, потому что это ключевое слово было сделано и предназначено для использования в этих обстоятельствах, и я полностью согласен с ним, но ключевые слова maybe_unused
кажутся мне слишком длинными, что делает код немного сложнее читать.
Я хотел бы следовать стандарту как "строго", как могу, но стоит ли его использовать?
Ответы
Ответ 1
Если параметр определенно не используется, [[maybe_unused]]
не особенно полезен, неназванные параметры и комментарии отлично [[maybe_unused]]
для этого.
[[maybe_unused]]
в основном полезен для вещей, которые потенциально не используются, например, в
void fun(int i, int j) {
assert(i < j);
// j not used here anymore
}
Это невозможно обрабатывать с неназванными параметрами, но если NDEBUG
определен, NDEBUG
предупреждение, потому что j
не используется.
Подобные ситуации могут возникать, когда параметр используется только для (потенциально отключенного) ведения журнала.
Ответ 2
Ответ Baum mit Augen является окончательным и неоспоримым объяснением. Я просто хочу привести еще один пример, который не требует макросов. В частности, С++ 17 ввел конструкцию constexpr if
. Таким образом, вы можете увидеть код шаблона, подобный этому (запретите глупые функции):
#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);
}
Начиная с написания этого сообщения, GCC 8.0.1 предупреждает меня о том, что t2
не используется, когда ветвь else - это экземпляр. Этот атрибут необходим и в таком случае.