GCC(4.7.2)與-Wextra
信號以下警告/錯誤(我-Werror
啓用):「警告:比較總是爲真」
比較永遠爲真由於數據類型[範圍有限-Wtype禁區]
以下代碼[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");
}
我明白爲什麼會發生在一個警告形式表達上下文,例如當我會用以下validate
功能:
template <typename T, std::size_t N>
bool validate(T value) {
return static_cast<std::size_t>(value) < N;
}
- 事實上,這就是爲什麼我使用擺在首位的專業模板(請注意,正確的模板特被使用,並且在我的第一個錯誤代碼由模板參數引發,而不是在非專用模板中的函數內部)。有沒有辦法解決這個警告?如果沒有,那不是編譯器中的錯誤嗎?
我想你可以通過專門化整個類來處理'N'超過'T'的最大值並且'validate'返回'true'的情況。 –
我認爲這是說bool是0或1,所以所有的布爾值都小於2. – flup
當我嘗試這個時,我的gcc 4.7.2-2沒有發出警告,雖然也許我使用了錯誤的包含。 – Neil