使用用户定义文字的成员时出现编译错误
Compile error when using a member of a user-defined literal
编译这段代码时(没有任何头文件)
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
被认为是那里的后缀。为什么编译器会这样解析它,而不是停在点上?
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
是一个有效的 pp-number 标记,0xe+foo
也是(参见 [lex.pptoken]/4 中的示例) ,.12.CA'TS_RULE..56.me+owp-urr
也是如此。如果后两者通过了翻译阶段 6,那么该程序是错误格式的,因为它无法在阶段 7 中转换为有效令牌。然而,在此之前,它是有效的,所以 maximal munch 说我们解析 0xe+foo
或 100.0_f.temp
作为单个预处理标记。
编译这段代码时(没有任何头文件)
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
被认为是那里的后缀。为什么编译器会这样解析它,而不是停在点上?
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
是一个有效的 pp-number 标记,0xe+foo
也是(参见 [lex.pptoken]/4 中的示例) ,.12.CA'TS_RULE..56.me+owp-urr
也是如此。如果后两者通过了翻译阶段 6,那么该程序是错误格式的,因为它无法在阶段 7 中转换为有效令牌。然而,在此之前,它是有效的,所以 maximal munch 说我们解析 0xe+foo
或 100.0_f.temp
作为单个预处理标记。