次のように定義されたクラスがあるとします。
class foo{};
さて、これはまったく問題ありません。
foo f;
なぜこれがコンパイラエラーになるのでしょうか? ( uninitialized const ‘f’
)
const foo f;
なぜこれをやらなければならないのでしょうか?
const foo f = foo();
なぜこれができないのかは分かっています。
const foo f(); // though it compiles..
興味深いことに、次のことは有効です。
const std::string f;
では何が欠けているのでしょうかfoo
?
そこには 3 つの質問があり、形式が悪いことは承知していますが、誰かが 1 つの回答でこれを解決してくれることを期待しています。
編集: 愚かな内容であれば遠慮なく閉じてください...
ベストアンサー1
あなたのクラスはポッド(基本的にデフォルトコンストラクタを提供していないため)。POD変数はない宣言時に初期化されます。つまり、次のようになります。
foo x;
は x を意味のある値に初期化しません。これは別途行う必要があります。 として宣言すると、これ以上const
割り当てたり変更したりすることができなくなるため、これが行われなくなる可能性がありますx
。
との同値性を考えてみましょうint
:
int x; // legal
const int y; // illegal
ご存知のとおり、std::string
の代わりにを使用するとfoo
コンパイルされます。これは、std::string
が POD ではないためです。このジレンマを簡単に解決するには、 のデフォルト コンストラクターを用意しますfoo
。
class foo {
public:
foo() { }
};
これでconst foo x;
コードがコンパイルされます。