2013-02-20 4 views
5

Я даже не уверен, разрешены ли отрицательные Литералы, заданные пользователем. Если нет, то почему их оставили?Как определить отрицательный UDL в C++ 11 (запрещены ли они?)?

Например, я хотел бы использовать:

auto money_i_owe_jack = -52_jpy; 

Это то, что я попытался с помощью GCC 4.7.2:

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

ОШИБКА

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

Вы попробовали? Я думаю, что им разрешено – balki

+0

@balki - да, я получаю ошибки компиляции - обновит OP за мгновение ... ... на самом деле, отрицательный двойной, как хорошо, из-за 'long double', но я не мог заставить его взять «длинный длинный» - попытаться повторить попытку. – kfmfe04

+0

Какой компилятор вы используете? [Это еще не очень широко поддерживается.] (Http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport) – cgmb

ответ

4

Целые литералы должны быть приняты как unsigned long long. Отрицательный знак не является частью литерала, он применяется после факта, к возвращаемому значению.

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

+1 ах - теперь имеет смысл - tyvm – kfmfe04

7

Независимо от того, являются ли определяемые пользователем или иным образом целые и литералы с плавающей точкой положительными.

Причина довольно проста: если вы допускаете отрицательные литералы, лексинг становится зависящим от контекста. То есть, сталкиваясь с чем-то вроде - 10, лексер не может просто взглянуть на этот текст отдельно и знать, следует ли рассматривать его как два отдельных токена (- и 10) или один (-10). Если вы всегда относились к ней как единый знак, а затем что-то вроде a - 10 приведет к <a> and <-10> (т.е. <identifier><literal>, которая не является легитимной последовательность в C++ (или большинство других языков программирования).

Чтобы обойти это, синтаксический анализатор может передать некоторый контекст лексеру, сообщая в любой момент, ожидать ли (например) оператора или операнда, чтобы он знал, что если он должен был создать оператор, то - следует рассматривать как токен , но если бы был найден операнд, -10 был бы единственным токеном.

Как правило, намного проще иметь одно правило, которое всегда следует за тысячами h, и тот, который работает, состоит в том, что - всегда является оператором, а буквальный не может включать в себя -.

+0

+1 отличное объяснение, почему литералы такие, как они есть - ty – kfmfe04

+1

Кроме того, унарный 'operator -' является перегружаемым, поэтому имеет смысл рассматривать его отдельно. – Xeo