C ++でconstオブジェクトを宣言するには、ユーザー定義のデフォルトコンストラクターが必要です。可変メンバー変数がある場合、どうしてですか?


8

C ++では、メンバー変数を持つクラスのオブジェクトをとして宣言するにconstは、ユーザー定義のデフォルトコンストラクターが必要です。次のコードはこれを示しています。

class Some {
    int value;
};

int main() {
    // error: default initialization of an object of const type 'const Some'
    //        without a user-provided default constructor
    const Some some;

    return 0;
}

ただし、クラスが所有するメンバー変数が変更可能として修飾されている場合、コンパイラーはエラーを報告しません。参考までに、コマンドを使用してコンパイルしましたclang++ -std=c++17 -stdlib=libc++ helloworld.cpp -o helloworld.out --debug。この結果はコンパイラのバグによるものなのか、C ++言語で定義された構文によるものなのでしょうか。

class Some {
    mutable int value;
};

int main() {
    const Some some;

    return 0;
}



2
mutableはの正反対ですconst。なぜ同じ効果を期待したのですか?
idclev 463035818

2
オブジェクトをに初期化しても意味constがありません。つまり、オブジェクトを変更できず、初期化されていない値が含まれているため、この種のコードは使用できないため、禁止されています。mutableキーワードを使用すると、値を後で変更できるため、コードを予測可能な方法で使用できます。
Moshe Gottlieb

4
@そうですか?OPは最初のスニペットが不正な形式であることをすでに認識しています。clangが診断なしで2番目のスニペットを受け入れる理由を不思議に思っています。
Bob__

回答:


2

私のコメントを回答として書き換えます。誰かの役に立てば幸いです。

なんらかの形で初期化されていなければ、constオブジェクトを宣言しても意味がありません。
次のコードを検討してください。

    const int x;

clangさんのコメントerror: default initialization of an object of const type 'const int'
gccは言うでしょう:error: uninitialized const ‘x’ [-fpermissive]

この背後にある論理は、このタイプの宣言には意味がないということです。
の値はx決して変更できないため、このコードはx、初期化されていないメモリにマップされるため、予測できません。
あなたの例では、にキーワードmutableを追加valueすることは、Someインスタンスが次のように宣言されている場合は定数ですが、

    const Some some;

value後で変更することも可能です。
例えば:

    some.value = 8;

これは、value後で設定でき、初期化されていない定数がないため、このコードを予測可能な方法で使用できることを意味します。


もしそうなら、gccにバグがあると判断できますか?プログラムをgccでコンパイルすると、メンバー変数が可変であってもエラーが報告されます。
ジンボムホン

1
申し訳ありません@jinbeomhong-わかりません。私が推測できるの、gccチームが標準を異なる方法で解釈することだけです
Moshe Gottlieb、

とにかく、私はこれらの結果が来ることを理解するために論理的な理由だけを必要としました、そしてあなたの論理に従うために、clang ++は合理的に構文を判断したと思います。ありがとう。
ジンボムホン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.