10

C ++ 11では、ユーザー定義のリテラルを取得します。C ++標準には、次のような例があります。

long double operator "" _w(long double);

そして、それは文字通りがアンダースコアで始まるべきだと言っています:

17.6.4.3.5ユーザー定義のリテラルサフィックス
アンダースコアで始まらないリテラルサフィックス識別子は、将来の標準化のために予約されています。

ただし、規格には別のセクションがあります。

17.6.4.3.2グローバル名
特定の名前と関数署名のセットは常に実装に予約されています:
—二重アンダースコア_ _を含む、またはアンダースコアとそれに続く大文字(2.12)で始まる各名前は、実装に予約されています。あらゆる用途。
—アンダースコアで始まる各名前は、グローバル名前空間で名前として使用するために実装に予約されています。

17.6.4.3.2(グローバル名)が何を言っているか/意味し、それが17.6.4.3.5(ユーザー定義のリテラルサフィックス)とどのように関連しているかを正確に理解したいと思っています。具体的には:

  • 17.6.4.3.2(グローバル名)の2番目の部分では、ユーザー定義のリテラル(上記のような_w)を名前空間(つまり、グローバル名前空間ではない)で定義する必要がありますか?もしそうなら、私は標準がこれを説明していたらいいのにと思います。
  • 17.6.4.3.2(グローバル名)の最初の部分では、(_W大文字が続く)__w_w__(2つの連続したアンダースコア)などのユーザー定義リテラルが除外されていると思います。正しい?

編集:

フォローアップとして、次のような標準の一部があります。


13.5.8ユーザー定義リテラル[...] 2declarator
- idがliteral-operator-idである宣言は、名前空間スコープ関数または関数テンプレートの宣言でなければなりません(フレンド関数(11.3)の場合もあります)。、関数テンプレートの明示的なインスタンス化または特殊化、またはusing宣言(7.3.3)。リテラル演算子IDで宣言された関数は、リテラル演算子です。literal-operator-idで宣言された関数テンプレートは、リテラル演算子テンプレートです。

強調鉱山。「namespace-scope」と表示されている場合、それはユーザー定義リテラルをユーザー定義の名前空間で宣言する必要があることを意味しますか(つまり、グローバル名前空間では宣言しません)?

後で編集:

最初に質問されたときには存在していませんでしたが、現在はこの関連する質問と回答もあり、読者は以下の回答を確認した後でさらに確認できます。

4

1 に答える 1

8

名前って何?3 つの基本概念 [basic] は次のことを示しています。

4 名前は、識別子 (2.11)、operator-function-id (13.5)、literal-operator-id (13.5.8)、conversion-function-id (12.3.2)、または template-id (14.2) の使用です。 )エンティティまたはラベルを示します(6.6.4、6.1)。

これを 13.5.8 ユーザー定義リテラル [over.literal] と相互参照します。

リテラル演算子 ID :
operator ""識別子

リテラル演算子の名前には識別子が含まれますが、その識別子はエンティティを示しません。(または、別のエンティティまたはラベルを完全に示す別の識別子と別の名前です。) そのため、リテラル演算子の名前がアンダースコアで始まることはありません。

のようなものoperator""__w 問題がありますが、これは新しいものではありません:int i__0;も予約されています。

于 2012-10-04T06:47:11.807 に答える