3

名前のアンダースコアに関する私の質問はここで部分的に回答されていますが、回答が不完全であるか、完全には理解していません。

宗派。C++11 標準の 2.14.8.7 では、このリテラル演算子を例として宣言しています。

long double operator "" _w(long double);

演算子を宣言する以外に、標準とその例はさらに 2 つのことを行います。これらは、別々に見た場合、それぞれ意味があります。

  • 名前_wはアンダースコアで始まります。と
  • オペレーターをグローバル名前空間に配置します。

私の質問には2つの部分があります:

  1. 上記のリンクの回答によると、名前_wは識別子ではないまたは識別子_w名前ではない、または...まあ、私は混乱しています。
  2. が大丈夫なら_w、大文字_Wでも大丈夫ですか? のように、 60.0 ワット60.0_Wを意味しますか? または、プリプロセッサが大文字のバージョンを誤って処理する可能性がありますか?

間違いなくあなたと同じように、私はグローバル名をアンダースコアで始める習慣はありません。これは、標準の宗派の習慣です。17.6.4.3.2.1 は明示的に非推奨のようです。したがって、アンダースコア、名前、およびリテラル演算子の問題に追加の光を当てることができれば、その光は高く評価されます.

4

1 に答える 1

10

わかりました、Clang チームの Richard Smith に確認し_Wました。あなたのリテラル演算子の部分は確かに予約済みの識別子や名前ではなく、マクロに名前を付けると展開される別のプリプロセッサ トークンでもあります。これは、識別子preprocessor-tokenである標準の副節 2.5 と、フェーズ 7 で発生する preprocessor-token が言語文法の単なるトークンに置き換えられる前に、フェーズ 4 の一部としてマクロ展開を持つ 2.2に従っています。 .

彼はまた、委員会のポートランド会議以来、はもはや単一の識別子ではないoperator""_Wため、マクロの拡大を防ぐことができると述べました。_WClang トランクは既にこれを実装しており、次のスニペットをコンパイルします。

#define _W _x

int operator""_W(unsigned long long){ return 42; }

int main(){
  int i = 1337_W;
}
于 2012-12-10T05:33:12.120 に答える