Tôi rất ngạc nhiên khi thấy trên các phiên bản khác nhau mẫu của g ++, các biên dịch sau đây mà không có lỗi hoặc cảnh báo:sử dụng lớp do không đủ số mẫu
// Adapted from boost::checked_delete()
template <class T> inline void assert_complete()
{
typedef char type_must_be_complete[ sizeof(T) ? 1 : -1 ];
(void) sizeof(type_must_be_complete);
}
class X;
void f()
{
assert_complete<X>();
}
class X {};
int main() {}
Nếu định nghĩa của X
bị thiếu hoặc trong một đơn vị dịch thuật khác nhau, tôi nhận được lỗi.
Nhưng trong chương trình như trên, không phải là định nghĩa của f
điểm khởi tạo đơn lẻ trong mẫu của tôi? Và không phải là sự thiếu hoàn toàn của X
tại điểm khởi tạo đó có phải là lỗi ngữ nghĩa không?
Chuẩn (C++ 03 và/hoặc C++ 11) có gọi chương trình này được định dạng tốt, không đúng định dạng, không đúng định dạng nhưng không bắt buộc hoặc không được xác định?
Chỉnh sửa: @David Rodriguez - dribeas báo cáo rằng clang ++, comeau và Visual Studio 2010 cũng chấp nhận mã tương tự.
Thật thú vị khi tôi thêm một 'int' vào định nghĩa của' X', 'sizeof (T)' là 4. Các mẫu đã được biết trong quá khứ để có khả năng nhận thức. –