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;
}

编译器(Ubuntu 14.04 上的 g++ 4.8 和 clang++ 3.4)会抱怨

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

似乎那里_f.temp被认为是后缀。为什么编译器会这样解析它,而不是停在点上?

4

1 回答 1

16

预处理数字是奇怪的野兽,主要是为了使预处理器更容易编写。

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是一个有效的pp-number标记,因此也是0xe+foo(参见 [lex.pptoken]/4 中的示例).12.CA'TS_RULE..56.me+owp-urr,. 如果后两者超过了翻译阶段 6,那么程序是错误的,因为它不能在阶段 7 中转换为有效的标记。然而,在那之前,它是有效的,所以 maximal munch 说我们解析0xe+foo100.0_f.temp作为单个预处理令牌。

于 2016-06-29T07:21:41.737 回答