5

次のコードは、clang で正常にコンパイルされます。C++ 標準がこれで問題ないかどうか知りたかったのです。

class A {
  static void x; // #1
  static const void x; // #2
  static volatile void x; // #3
};

私の意見では、どの宣言も有効ではありません。永続的な C++ 標準検証スイートには、その ようなテスト (#1) があり、clang (v3.4) はそのテストで失敗します。

ただし、#1から静的を削除すると、clangは予想どおりエラーを報告します。

標準を調べたところ、静的データ メンバーに関する 1 つの段落 (9.4.2-2) が見つかりました。

2 クラス定義内の静的データ メンバーの宣言は定義ではなく、cv 修飾された void 以外の不完全な型である可能性があります。...

私が理解しているように、この行は #2 と #3 を無効として失格としていますが、#1 については不明です。#1を除外する必要がある静的ストレージクラスの宣言に関連する詳細はありますか?

ありがとう、

4

1 に答える 1

5

いいえ、これは許可されていません。正確に引用した段落のためです。引用する段落の「cv-qualified」という用語には、非修飾が含まれていることに注意してください。C++11 標準のパラグラフ 3.9.3/10 によると:

この国際標準では、型の説明で使用される表記法cv(またはcv1,cv2など) は、cv 修飾子の任意のセット、つまり { const}、{ volatile}、{ constvolatile}、または空のセットのいずれかを表します。

于 2013-07-02T18:21:52.120 に答える