GCC (4.7.2) với -Wextra
tín hiệu cảnh báo/báo lỗi sau (Tôi đã -Werror
kích hoạt):“Cảnh báo: so sánh là luôn luôn đúng”
So sánh luôn luôn đúng do nhiều hạn chế về kiểu dữ liệu [ -Wtype hạn]
cho đoạn mã sau [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");
}
tôi hiểu tại sao các cảnh báo có thể xảy ra trong một ngữ cảnh biểu thức ormal, ví dụ: khi tôi đã sử dụng các validate
chức năng sau:
template <typename T, std::size_t N>
bool validate(T value) {
return static_cast<std::size_t>(value) < N;
}
- Trong thực tế, đó là lý do tại sao tôi đang sử dụng mẫu chuyên ở nơi đầu tiên (và lưu ý rằng mẫu đúng chuyên môn được sử dụng, và các lỗi trong đầu tiên của tôi mã được nêu lên bởi đối số mẫu, không phải bên trong hàm trong mẫu không được chuyên biệt hóa). Có cách nào xung quanh cảnh báo này không? Nếu không, đó không phải là lỗi trong trình biên dịch phải không?
Tôi cho rằng bạn có thể làm việc xung quanh nó bằng cách chuyên toàn bộ lớp cho các tình huống trong đó 'N' vượt quá giá trị lớn nhất của' T' và có 'validate' trả về' true'. –
Tôi nghĩ rằng nó nói rằng bool là 0 hoặc 1, vì vậy tất cả các bools là ít hơn 2. – flup
gcc của tôi 4.7.2-2 đã không cảnh báo khi tôi đã thử này, mặc dù có thể tôi đã sử dụng sai bao gồm. – Neil