Рассмотрим классический пример:Как отметить неиспользуемый параметр функции constexpr?
template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&array)[N]) noexcept { return N; }
Теперь это работает отлично, но есть одна неприятность, НКУ выдает предупреждение:
warning: unused parameter ‘array’ [-Wunused-parameter]
Известные решения:
- Безразлично» t: Если я добавлю классику
(void)arr;
к функции, я получаюerror: body of constexpr function ‘...‘ not a return-statement
. - Неудовлетворительно: Я могу иметь
arraySize(T (&)[N])
, но я хочу назвать аргумент по двум причинам:- Это делает сообщение об ошибке компилятора более понятным.
- Более субъективно, я думаю, что он делает код более понятным, особенно тем, кто не живет и не дышит этим синтаксисом.
- Не хорошо: В этом конкретном примере, я мог бы также
return sizeof(array)/sizeof(array[0]);
, но этот подход не является универсальным решением, а также я думаюreturn N;
гораздо лучше, безусловно, легче на глаз. - Хорошо, но не всегда возможно: переключитесь на использование C++ 14 и компилятора, который полностью поддерживает его. Тогда допускается тело функции constexpr, например
{ (void)array; return N; }
.
Как я могу избавиться от неиспользуемого параметра предупреждения красиво, при использовании 11 C++?
Я не на своем ноутбуке, а просто используя 'arraySize (T *)' (без имени для вас не нужен) не решает? Конечно, с правильным типом, извините, если я не могу попробовать вас ... – skypjack
@skypjack Как я понимаю, требуется ссылка на массив. В противном случае компилятор не может автоматически выдавать 'N'. Вот почему 'arraySize (T [N])' тоже не будет работать (проверено, не будет компилироваться без явного указания 'N' в качестве аргумента шаблона при вызове функции). – hyde
'arraySize (T (&) [N])'? Это должно работать, но я не уверен в предупреждении, потому что я не могу попробовать. Если все в порядке, я отвечу в ответ. – skypjack