template<typename T, typename U = void>
struct S { /* static_assert(0, "type unsupported"); */ };
template<typename T>
struct S<T, typename std::enable_if<std::is_integral<T>::value, void>::type> {
void foo() {}
};
...
S<int> i;
i.foo();
S<double> d;
// d.foo();
tôi sẽ mong đợi rằng "bậc thầy mẫu" sẽ không bao giờ được khởi tạo cho trường hợp của int
, nhưng nếu tôi bỏ ghi chú static_assert
, các S<int>
instantiation sẽ thất bại. Thậm chí một số typedef S<int> Si;
cũng không thể biên dịch được. (GCC 4.9.2 Cygwin)static_assert với mẫu phần chuyên môn hóa
Những gì tôi muốn đạt được không phải là cho S<double>
không thành công tại cuộc gọi foo()
, nhưng tại thời điểm diễn ra bản thân mẫu và với thông báo lỗi có ý nghĩa. Tôi biết rằng tôi có thể làm điều gì đó như typename T::nonexistent_type t;
trong mẫu chính sẽ ngăn mẫu biên dịch, nhưng điều đó sẽ kém hơn thông báo static_assert
. (Lưu ý: đặt static_assert
trong định nghĩa hàm trong mẫu chính vẫn không biên dịch được cho S<int>
)
Tại sao static_assert
không thành công mặc dù mẫu đó không được khởi tạo? Điều này có được uỷ quyền (hoặc có lẽ là "không xác định") theo tiêu chuẩn không? Có cách nào để thất bại với cách static_assert
theo cách tôi muốn không?
xem [Tại sao 'static_assert' luôn được gọi?] (Http://stackoverflow.com/q/27738971/3953764) –