Обозначение неиспользуемых параметров [[maybe_unused]]
В процессе переопределения виртуальных методов, и в случае неиспользования отдельных параметров, и дабы избежать предупреждений компилятора, можно опускать имена параметров. Например:
bool MainWindow::nativeEvent(const QByteArray&,
void *message,
long *)
Но, начиная с С++17 появились атрибуты, один из которых [[maybe_unused]]. Что позволяет переписать код выше так:
bool MainWindow::nativeEvent([[maybe_unused]] const QByteArray& eventType,
void *message,
[[maybe_unused]] long *result)
Простой вопрос, что полезного дает это "нововведение"? Пока я вижу, что только разрастается код. Ну, на крайний случай, использование параметра в режиме отладки и неиспользование для релиза.
Ответы (2 шт):
Это необходимо при условной компиляции:
bool MainWindow::nativeEvent([[maybe_unused]] const QByteArray& eventType,
void *message,
[[maybe_unused]] long *result) {
#ifdef HAS_NATIVE_EVENTS
if(eventType == 0x18) {
result = eventType[0];
}
#endif
// ...
}
Дополнено
До [[maybe_unused]] для того чтобы подавить предупреждение о неиспользуемом параметре/переменной приходилось добавлять хаки из серии (void)result; или вообще отключать его.
Частным, но распространённым случаем такого использования является макрос assert(), который обычно объявляется как-то вроде:
#ifndef NDEBUG
# define assert(expr) ((expr) ? 0 : do_assert_fail())
#else
# define assert(expr) (0)
#endif
Подробности также можно найти в исходном предложении в комитет по стандартизации С++ [PDF].
[maybe_unused] нужен не для всегда неиспользуемых сущностей, а для возможно неиспользуемых, что следует из названия.
#include <type_traits>
template<typename T>
T foo([[maybe_unused]] T x, [[maybe_unused]] T y) {
if constexpr (std::is_same_v<T, int>) {
return x + y;
} else if constexpr (std::is_same_v<T, float>) {
return x + 42;
} else {
return y + 42;
}
}
int main() {
foo(1, 2);
foo(1.f, 2.f);
foo(1., 2.);
}
Если убрать тут атрибуты, то могут быть предупреждения.
Ещё один частый пример использования — assert(), о котором подробнее можно посмотреть в ответе участника @Fat-Zer.