2013-02-20 22 views
5

Tôi thậm chí không chắc chắn nếu âm tính do Người dùng định nghĩa tiêu cực được cho phép. Nếu không, tại sao họ lại bỏ đi?Làm cách nào để xác định UDL phủ định trong C++ 11 (chúng không được phép?)?

Ví dụ, tôi muốn sử dụng:

auto money_i_owe_jack = -52_jpy; 

Đây là những gì tôi đã cố gắng sử dụng gcc 4.7.2:

constexpr int64_t operator "" _jpy(long long l) 
{ 
    return static_cast<int64_t>(l); 
} 

LỖI

Test_udl.cpp:60:47: error: ‘constexpr int64_t operator"" _jpy(long long int)’ has invalid argument list 
+0

Bạn đã thử? Tôi nghĩ rằng họ được phép – balki

+0

@ balki - vâng, tôi nhận được các lỗi biên dịch - sẽ cập nhật OP trong giây lát ... ... thực sự, một số âm gấp đôi là ok, do 'long double', nhưng tôi không thể làm cho nó mất một 'long long' - lemme thử lại. – kfmfe04

+0

Bạn đang sử dụng trình biên dịch nào? [Nó không được hỗ trợ rộng rãi lắm.] (Http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport) – cgmb

Trả lời

4

literals Integer cần được chấp nhận là unsigned long long. Dấu âm không phải là một phần của chữ, nó được áp dụng sau thực tế, với giá trị trả về.

constexpr int64_t operator "" _jpy(unsigned long long l) 
{ 
    return static_cast<int64_t>(l); 
} 
+0

+1 ah - hiện tại - tyvm – kfmfe04

7

Cho dù người dùng xác định hoặc cách khác, số nguyên và dấu chấm động luôn luôn là số dương.

Lý do khá đơn giản: nếu bạn cho phép các chữ cái âm, lexing trở thành ngữ cảnh phụ thuộc. Tức là, khi phải đối mặt với một cái gì đó giống như - 10, người lexer không thể chỉ xem văn bản đó một mình và biết liệu nó có được coi là hai mã riêng biệt (-10) hay một (-10). Nếu bạn luôn coi đó là một mã thông báo, thì một cái gì đó như a - 10 sẽ dẫn đến <a> and <-10> (ví dụ: <identifier><literal>, không phải là một chuỗi hợp pháp trong C++ (hoặc hầu hết các ngôn ngữ lập trình khác).

Để giải quyết vấn đề đó, trình phân tích cú pháp có thể cung cấp ngữ cảnh cho lexer, nói tại bất kỳ thời điểm nào cho dù mong đợi (ví dụ) toán tử hay toán hạng, vì vậy nó sẽ biết rằng nếu nó là để tạo toán tử, thì - sẽ được coi là mã thông báo của riêng mình, nhưng nếu toán hạng được mong đợi, -10 sẽ là một mã thông báo duy nhất.

Nói chung dễ dàng hơn để có một quy tắc duy nhất luôn tuân theo thoug h và một hoạt động là - luôn là một toán tử và chữ cái không thể bao gồm một số -.

+0

+1 giải thích tuyệt vời về lý do tại sao chữ là cách chúng - ty – kfmfe04

+1

Ngoài ra, toán tử đơn nhất '' là quá tải, do đó, nó có ý nghĩa hơn để xử lý nó một cách riêng biệt. – Xeo