Tôi nhận thấy rằng các xác nhận tĩnh trong các mẫu lớp không được kích hoạt khi các phiên âm là typedef
'ed.Có nên kích hoạt static_assert bằng typedef không?
#include <type_traits>
template <typename T>
struct test_assert
{
static_assert(std::is_same< T, int >::value, "should fail");
};
typedef test_assert<float> t;
Mã này biên dịch không có lỗi. Nếu tôi cố gắng tạo ra một thể hiện, sau đó sự khẳng định thất bại:
t obj; // error: static assertion failed: "should fail"
Cuối cùng, nếu tôi thay thế tình trạng này với false
, sự khẳng định thất bại thậm chí nếu tôi không nhanh chóng các lớp mẫu:
template <typename T>
struct test_assert
{
static_assert(false, "always fails");
};
Tôi đã thử mã này trên gcc-4.5.1 và gcc-4.7.0. Hành vi này có bình thường không? Vào thời điểm nào trình biên dịch phải xác minh các xác nhận tĩnh? Tôi đoán hai giai đoạn tra cứu có liên quan, nhưng không nên typedef kích hoạt giai đoạn thứ hai?
+1. Câu hỏi tuyệt vời. :-) – Nawaz