GCC (4.7.2) con -Wextra
segnala il seguente avviso/errore (ho -Werror
abilitato):“Attenzione: il confronto è sempre vero”
Il confronto è sempre vero a causa della limitata gamma del tipo di dati [ -Wtype-limits]
per il seguente codice [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");
}
capisco perché l'avviso si sarebbe verificato in un contesto di espressione ormale, ad es. quando avrei usato il validate
seguente funzione:
template <typename T, std::size_t N>
bool validate(T value) {
return static_cast<std::size_t>(value) < N;
}
- In realtà, è per questo che sto usando il modello di specializzazione, in primo luogo (e si noti che il modello corretto di specializzazione viene utilizzato, e l'errore nel mio primo il codice viene generato dall'argomento del modello, non all'interno della funzione nel modello non specificato). C'è un modo per aggirare questo avvertimento? Se no, non è un bug nel compilatore?
Suppongo che si possa aggirare il problema specializzando l'intera classe per situazioni in cui 'N' supera il valore massimo di' T' e ha 'validate' return' true'. –
Penso che il bool sia 0 o 1, quindi tutti i bool sono minori di 2. – flup
Il mio gcc 4.7.2-2 non ha avvisato quando ho provato questo, anche se forse ho usato gli include sbagliati. – Neil