10

否定的なユーザー定義リテラルが許可されているかどうかさえわかりません。そうでない場合、なぜ彼らは除外されたのですか?

たとえば、私は使用したいと思います:

auto money_i_owe_jack = -52_jpy;

これは私がgcc4.7.2を使って試したものです:

constexpr int64_t operator "" _jpy(long long l)
{
  return static_cast<int64_t>(l);
}

エラー

Test_udl.cpp:60:47: error: ‘constexpr int64_t operator"" _jpy(long long int)’ has invalid argument list
4

2 に答える 2

16

ユーザー定義であろうとなかろうと、整数リテラルと浮動小数点リテラルは常に正です。

理由はかなり単純です。負のリテラルを許可すると、字句解析はコンテキストに依存するようになります。つまり、のようなものに直面した場合、レクサーはそのテキストを単独で見て、2つの別々のトークン(および)または1つの( )- 10として扱う必要があるかどうかを知ることはできません。常に単一のトークンとして扱った場合、次のような結果になります(つまり、C ++(または他のほとんどのプログラミング言語)では正当なシーケンスではありません)。-10-10a - 10<a><-10><identifier><literal>

これを回避するために、パーサーレクサーにコンテキストをフィードして、任意の時点で(たとえば)演算子またはオペランドのどちらを期待するかを指示できるため、演算子を生成する場合は、-を処理する必要があることがわかります。独自のトークンとして、ただしオペランドが期待される場合-10は、単一のトークンになります。

ただし、常に従う単一のルールを使用する方が一般的に簡単です。機能するのは、-が常に演算子であり、リテラルにa-を含めることはできないということです。

于 2013-02-20T05:40:18.647 に答える
7

整数リテラルはとして受け入れる必要がありますunsigned long long。負の符号はリテラルの一部ではなく、事後に戻り値に適用されます。

constexpr int64_t operator "" _jpy(unsigned long long l)
{
  return static_cast<int64_t>(l);
}
于 2013-02-20T05:33:30.483 に答える