Rozważmy to klasyczny przykład:Jak oznaczyć nieużywany parametr funkcji constexpr?
template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&array)[N]) noexcept { return N; }
Teraz to działa prawidłowo, ale jest jeden kłopot, gcc daje ostrzeżenie:
warning: unused parameter ‘array’ [-Wunused-parameter]
znane rozwiązania:
- robi” t praca: jeśli dodaję klasyczną funkcję
(void)arr;
, otrzymamerror: body of constexpr function ‘...‘ not a return-statement
. - Niezadowalający: Mogę mieć
arraySize(T (&)[N])
, ale chcę, aby wymienić argument z dwóch powodów:- To sprawia, że komunikat o błędzie kompilatora bardziej zrozumiałe.
- Bardziej subiektywnie, myślę, że czyni to kod jaśniejszym, szczególnie dla tych, którzy nie żyją i oddychają tą składnią.
- Niezły: W tym konkretnym przykładzie, mogę również
return sizeof(array)/sizeof(array[0]);
, ale takie podejście nie jest uniwersalnym rozwiązaniem, a także myślęreturn N;
jest o wiele ładniejszy, zdecydowanie łatwiejsze w oku. - Dobre, ale nie zawsze możliwe: przełącz na C++ 14 i kompilator, który obsługuje go w pełni. Następnie dozwolone jest ciało funkcji constexpr, takie jak
{ (void)array; return N; }
.
Jak mogę dobrze usunąć ostrzeżenie o nieużywanym parametrze, używając C++ 11?
Nie jestem na moim laptopie, ale po prostu używając 'arraySize (T *)' (bez nazwy dla ciebie nie potrzebujesz tego) nie rozwiązuje? Oczywiście, z odpowiednim typem, przepraszam, jeśli nie mogę spróbować dla ciebie ... – skypjack
@skypjack Jak rozumiem, wymagane jest odwołanie do tablicy. W przeciwnym razie kompilator nie może automatycznie przyznać 'N'. Dlatego 'arraySize (T [N])' nie zadziała (przetestowane, nie skompiluje się bez jawnego podania 'N' jako argumentu szablonu podczas wywoływania funkcji). – hyde
'arraySize (T (&) [N])'? To powinno zadziałać, ale nie jestem pewien ostrzeżenia, bo nie mogę spróbować. Jeśli wszystko będzie dobrze, odpowiem. – skypjack