Gần đây tôi đã bắt đầu đọc Thiết kế C++ Hiện đại của Andrei Alexandrescu. Sau khi đọc các xác nhận về thời gian biên dịch, tôi đã thử mã sau:CompileTimeChecker từ Thiết kế Hiện đại C++ không hoạt động như mong đợi
template<bool> struct CompileTimeChecker { CompileTimeChecker(...){}; }; template<> struct CompileTimeChecker<false>{}; #define STATIC_CHECK(expr, msg) \ {\ class ERROR_##msg{}; \ (void)sizeof(CompileTimeChecker<(expr)!=0>((ERROR_##msg()))); /*Line 1*/ } int main() { STATIC_CHECK(sizeof(char)>sizeof(int),TypeTooNarrow); /*Line 2*/ STATIC_CHECK(sizeof(char)<sizeof(int),TypeTooNarrow); /*Line 3*/ }
Mã không được biên dịch do Dòng 2, nhưng nó biên dịch tốt. Nếu tôi thay đổi Line 1 tới
(void)(CompileTimeChecker<(expr)!=0>((ERROR_##msg()))); /*Line 1*/ }
hoặc
new CompileTimeChecker<(expr)!=0>((ERROR_##msg())); /* Line 1*/ }
nó hoạt động như mong đợi. Tôi không hiểu.
Bản sao chính xác (cùng một người dùng): [CompileTimeChecker từ Thiết kế C++ Hiện đại không hoạt động như mong đợi.] (Http://stackoverflow.com/questions/3934643/compiletimechecker-from-modern-c-design-not-working-as bất ngờ) –
Đóng một tài khoản khác là trùng lặp. Hãy để cái này mở ra. –
@Paul R: Tôi nghĩ @Saurabh đã đăng cùng một câu hỏi hai lần (do nhầm lẫn mà tôi nghĩ), một câu hỏi khác đã bị đóng như trùng lặp với điều này và bây giờ bạn đang đóng này xem xét việc này là bản dupe của người khác. –