使用用户定义的文字成员时编译错误

neu*_*ont 11 c++ user-defined-literals c++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;
}
Run Code Online (Sandbox Code Playgroud)

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

error: unable to find numeric literal operator ‘operator"" _f.temp’
     100.0_f.temp;
     ^
Run Code Online (Sandbox Code Playgroud)

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

T.C*_*.C. 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 .
Run Code Online (Sandbox Code Playgroud)

12是一个有效的pp-number标记,所以0xe+foo(参见[lex.pptoken]/4中的示例),同样如此.12.CA'TS_RULE..56.me+owp-urr.如果后两个使它超过翻译阶段6,则程序格式不正确,因为它在阶段7中无法转换为有效令牌.然而,在此之前,它是有效的,因此最大的munch表示我们解析0xe+foo100.0_f.temp作为单个预处理令牌.

  • 我永远不会想到`0xe + foo`可能是无效的C++,这似乎是错误的...... (2认同)