2016-06-29 3 views
11

При компиляции этого кода (без какого-либо заголовка)Ошибка компиляции при использовании члена определенного пользователя буквального

template <typename T> 
struct Temperature { 
    T temp; 

    explicit Temperature(T t) 
     : temp(t) 
    {} 
}; 

Temperature<long double> operator "" _f (long double t) 
{ 
    return Temperature<long double>((t - 32)/1.8); 
} 

int main() 
{ 
    auto t = 100.0_f; 
    t.temp; 

    100.0_f.temp; // ERROR AT THIS LINE 
    return 0; 
} 

составителей (как G ++ 4.8 и лязг ++ 3.4 на Ubuntu 14.04) будут жаловаться, что

error: unable to find numeric literal operator ‘operator"" _f.temp’ 
    100.0_f.temp; 
    ^

Кажется, что _f.temp рассматривается как суффикс. Почему компиляторы разбирают это так, вместо того, чтобы останавливаться на точке?

+2

Максимальный жеватель. '100.0_f.temp' - действительный токен * pp-number *. –

+1

Изменить на '(100.0_f) .temp' – Mine

+0

@ T.C. Не знаю, что токен pp-номера может содержать более одной точки. Не могли бы вы показать мне пример в такой форме? – neuront

ответ

14

Preprocessing numbers - это странные звери, предназначенные в основном для облегчения написания препроцессора.

pp-number: 
    digit 
    . digit 
    pp-number digit 
    pp-number identifier-nondigit 
    pp-number ' digit 
    pp-number ' nondigit 
    pp-number e sign 
    pp-number E sign 
    pp-number p sign 
    pp-number P sign 
    pp-number . 

12 является допустимым рр номер маркер, так 0xe+foo (смотри пример в [lex.pptoken]/4), и поэтому .12.CA'TS_RULE..56.me+owp-urr. Если последние два делают его прошлой фазой перевода 6, тогда программа плохо сформирована, потому что она не может быть преобразована в действительный токен в фазе 7. До тех пор, однако, это действительно так, поэтому максимальный munch говорит, что мы анализируем или 100.0_f.temp как один токен предварительной обработки.

+0

Действительно, звери. Надеюсь, что стандарт дает обновление, чтобы коды легче писать. – neuront

+2

Я бы никогда не подумал, что '0xe + foo' может быть недействительным C++, это кажется настолько неправильным ... – Holt

 Смежные вопросы

  • Нет связанных вопросов^_^