Trong C++ 11 khi một chỉ thị tiền xử lý của mẫu ...Bao gồm điều kiện trong C++ 11 với chữ được người dùng xác định?
#if expr
... đang gặp phải, expr
được đánh giá là một constant-expression
như mô tả trong 16.1 [cpp.cond]
.
này được thực hiện sau khi thay thế vĩ mô trên expr
, định danh của nó (và từ khóa) được thay thế bằng 0, preprocessing-tokens
của nó được chuyển đổi thành tokens
, defined
điều hành được đánh giá, và vân vân.
Câu hỏi của tôi là điều gì sẽ xảy ra khi một trong các mã thông báo trong expr
là user-defined-literal
?
Các chữ cái do người dùng định nghĩa giống như các cuộc gọi chức năng, nhưng các cuộc gọi chức năng không thể xảy ra trong expr
(Tôi nghĩ), như là một tác dụng phụ của việc thay thế số nhận dạng. Tuy nhiên về mặt kỹ thuật, user-defined-literals
có thể tồn tại.
Tôi nghi ngờ đó là lỗi, nhưng tôi hoàn toàn không thể thấy cách kết luận điều đó từ tiêu chuẩn?
Có lẽ tác động (pedantic) của việc thêm các chữ người dùng được xác định theo điều 16 [cpp]
đơn giản là bị bỏ qua?
Hoặc tôi có thiếu gì đó không?
Cập nhật:
Để làm rõ bằng một ví dụ:
gì preprocess này để:
#if 123_foo + 5.5 > 100
bar
#else
baz
#endif
thanh hoặc baz hoặc là nó lỗi?
GCC 4.7 báo cáo:
test.cpp:1:5: error: user-defined literal in preprocessor expression
nên nó nghĩ rằng nó là một lỗi. Điều này có thể được biện minh với tham chiếu đến tiêu chuẩn không? Hay đây chỉ là "ngầm"?
Khái niệm tiền xử lý của "biểu thức liên tục" hoàn toàn khác với C++, tôi tin. Bạn thực sự chỉ có thể sử dụng các chữ và macro mở rộng thành chữ cuối cùng ... ít nhất đó là cách tôi luôn hiểu nó. –
Có vẻ như phiên bản g ++ của bạn thiếu thứ gì đó, không phải bạn. –
Tôi nghi ngờ đó là ý định của ủy ban để cho phép loại điều này, vì logic của tiền xử lý và ngữ nghĩa ngôn ngữ luôn luôn tách biệt nhau. Nhưng vâng, tiêu chuẩn dường như ngụ ý nó nên được xử lý. – aschepler