GCC (4.7.2) z -Wextra
sygnalizuje następujące ostrzeżenie/błąd (mam -Werror
włączone):„Ostrzeżenie: porównanie jest zawsze prawdziwe”
Porównanie zawsze jest prawdziwe ze względu na ograniczony zakres danych typu [ -Wtype terminy]
na poniższym kodzie [try online]:
template <
typename T,
std::size_t N,
bool = static_cast<std::size_t>(std::numeric_limits<T>::max()) < N>
struct validator {
static constexpr bool validate(T value) {
return static_cast<std::size_t>(value) < N;
}
};
template <typename T, std::size_t N>
struct validator<T, N, true> {
static constexpr bool validate(T) {
return true;
}
};
int main() {
// Works
static_assert(validator<int, 4>::validate(3), "Invalid");
// Error :-(
static_assert(validator<bool, 2>::validate(true), "Invalid");
}
rozumiem dlaczego ostrzeżenie nastąpiłoby w sposób kontekst ekspresji oralnej, np. kiedy użyłem następujące validate
funkcję:
template <typename T, std::size_t N>
bool validate(T value) {
return static_cast<std::size_t>(value) < N;
}
- W rzeczywistości, dlatego używam specjalistycznego szablonu w pierwszej kolejności (i pamiętać, że prawidłowe specjalizacji szablon jest używany, a błąd w moim pierwszym kod jest wywoływany przez argument szablonu, a nie wewnątrz funkcji w niespecyficznym szablonie). Czy istnieje sposób obejścia tego ostrzeżenia? Jeśli nie, czy nie jest to błąd w kompilatorze?
Przypuszczam, że można obejść go, specjalizując całą klasę w sytuacjach, w których 'N' przekracza maksymalną wartość' T' i ma 'validate' return' true'. –
Myślę, że to powiedzenie, że bool ma wartość 0 lub 1, więc wszystkie sygnały są mniejsze niż 2. – flup
Mój gcc 4.7.2-2 nie ostrzegał, gdy próbowałem tego, chociaż może użyłem niewłaściwych załączeń. – Neil