Когда следует использовать [[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 - это экземпляр. Этот атрибут необходим и в таком случае.