7

次のコードは、GCC と Clang の両方でコンパイルされます。

long double operator""_a(long double);     
auto x = 0e1_a+0; // OK 

_aしかし、これではありません( に置き換え_eます):

long double operator""_e(long double);
auto y = 0e1_e+0; // Error: unable to find numeric literal operator 'operator""_e+0'

OTOH、このコードはコンパイルされます:

auto z = 0e1_e +0; // OK

どうしたの?

(この質問は、この GCC バグ レポートに触発されています。)

4

1 に答える 1

14

マキシマムムンクが再びストライキします。

[lex.pptoken]/p3:

入力ストリームが特定の文字までの前処理トークンに解析されている場合:

  • [ここでは関係のない 2 つの例外]
  • それ以外の場合、 ヘッダー名#include(2.8) がディレクティブ (16.2)内でのみ形成されることを除いて、次の前処理トークンは、前処理トークンを構成できる最長の文字シーケンスです。

問題は、 が0e1_e+0とは異なり0e1_a+0、有効な前処理番号 ([lex.ppnumber]) であることです。

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 .

その結果、0e1_e+0単一のpp-number前処理トークンとして解析され、(明らかな理由で) 有効なトークンに変換できないため、後で爆発します。

0e1_a+0一方、 は、0e1_a+、およびの 3 つのトークンとして解析され0、すべて問題ありません。

于 2015-11-12T11:18:33.443 に答える