GCC (4.7.2) mit -Wextra
signalisiert die folgende Warnung/Fehler (ich habe -Werror
aktiviert):„Warnung: Vergleich ist immer wahr“
Vergleich immer wahr ist aufgrund der begrenzten Reichweite von Datentyp [ -Wtype-limits]
für den folgenden Code [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");
}
ich verstehe, warum die Warnung in einem auftreten würde, oraler Expressionskontext, z.B.
template <typename T, std::size_t N>
bool validate(T value) {
return static_cast<std::size_t>(value) < N;
}
- In der Tat, das ist, warum ich die spezielle Vorlage in erster Linie bin mit (und beachten Sie, dass die richtige Vorlage Spezialisierung verwendet wird, und den Fehler in meinem ersten: wenn ich hätte die folgende validate
Funktion Code wird vom Template-Argument ausgelöst, nicht innerhalb der Funktion in der unspezialisierten Vorlage). Gibt es einen Weg um diese Warnung? Wenn nicht, ist das nicht ein Fehler im Compiler?
Ich nehme an, Sie könnten es umgehen, indem Sie die gesamte Klasse für Situationen spezialisieren, in denen 'N' den Maximalwert von' T' überschreitet und 'validate' return' true' hat. –
Ich denke es heißt, dass Bool entweder 0 oder 1 ist, also sind alle Bools weniger als 2. – flup
Mein gcc 4.7.2-2 warnte nicht, als ich das versuchte, obwohl ich vielleicht die falschen Includes verwendet habe. – Neil