0

Visual Studio で奇妙なことに遭遇しました。

const修飾された (つまり; で終わる)メンバー関数を配置する場合、その直後にアクセス指定子 (つまり; 、または)constを配置することはできません。publicprotectedprivate

ここに画像の説明を入力

    // ...
    int GetFour() { return 4; } const
private:
    static ClassName * Instance;
    Settings();
    // ...

また、メンバー関数プロトタイプの順序を変更し、アクセス指定子の前に非 const メンバー関数を配置すると、すべてが修正されます (エラーなしでコンパイルおよび実行されます)。

ここに画像の説明を入力

    // ...
    int GetFour() { return 4; } const
    int GetFive() { return 5; }
private:
    static ClassName * Instance;
    ClassName();
    // ...

これが C++ のルールなのか、Visual Studio の単なるバグなのか、それとも私がしたことなのか知りたいですか?

(バージョン: Visual Studio Ultimate 2012 Update 3)

4

3 に答える 3

3
int GetFour() { return 4; } const

間違った場所。

正解です:

int GetFour() const { return 4; } 

つまりconst、 関数の直後で の()前に表示され{ます。


次のコードがコンパイルされます。

int GetFour() { return 4; } const
int NonConstFunc();

constafter は、次の関数の戻り値の型の一部}と見なされるためです。したがって、上記は実際には次のとおりです。

int GetFour() { return 4; }  
const int NonConstFunc();

それが役立つことを願っています。

于 2013-08-12T13:58:58.927 に答える
3

あなたの構文は間違っています。const関数定義の後に配置しています。あなたはこれを必要とします:

int GetFour() const { return 4; }
//            ^^^^^

2番目のバリアントがコンパイラエラーを生成しない理由は、このように解析されるためです

int GetFour() { return 4; } 
const int GetFive() { return 5; }
于 2013-08-12T13:59:07.780 に答える
1

const間違った場所にあります。の直前にあるはず{です。

int GetFour() const { return 4; }
于 2013-08-12T13:58:30.450 に答える