4

私のコンパイラは(実際にApple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)は)そのコードを受け入れ(コンパイル)ます:

class X {
private:
  int i;
public:
  const X() { cout << "here" << endl; i=0; }
  void f() const {}
  void g() {}
};

int main() {
  const X x;
  x.f();
  //  x.g();
  X y;
  y.f();
  y.g();
}

constctor 定義の前に修飾子がないかのように機能します。-Wall私は、異なる種類の標準のアクティベーションを試し-pedanticましたが、常に同じです...だから:

  • 私は何かを逃しましたか?最新の標準では構文的に正しいことがわかりませんでした…</li>
  • これは gcc/llvm のバグですか? gcc/llvm黙って無視しているようですconst
  • これは私が見逃した機能であり、私の例ではその有用性を実証できませんか?

注: gcc 3.4.3 も gcc 4.4.5 もコンパイルしません。

4

1 に答える 1

3

私が知る限り、これは有効な構文のようには見えませんが、ドラフトの C++ 標準セクション12.1 コンストラクターの段落1には次のように書かれています。

コンストラクターには名前がありません。コンストラクターの宣言または定義には、特別な宣言子構文が使用されます。構文は次を使用します。

— 各 decl-specifier が function-specifier または constexpr のいずれかであるオプションの decl-specifier-seq、

— コンストラクターのクラス名、および

— パラメータリスト

セクションからわかるように、7.1.2 関数指定子は次のとおりです。

function-specifier:
 inline
 virtual
 explicit

上記のコメントのアリ経由で、バグレポートが提出され、確認および解決されました。

于 2013-11-12T17:43:00.363 に答える