1

このコードをコンパイルするには:

std::vector<Foo> factory() 
{
    std::vector<Foo> data;
    return data;
}

POD を次のように定義する必要があります。

struct Foo
{
    const int i;
    const int j;

    Foo(const int _i, const int _j): i(_i), j(_j) {}

    Foo(Foo& foo): i(foo.i), j(foo.j){}

    Foo operator=(Foo& foo)
    {
        Foo f(foo.i, foo.j);
        return f;
    }
};

これは、作成後にポッド メンバーを変更することに関心がないポッドを定義するための正しいアプローチですか? コピー コンストラクターを定義し、代入演算子をオーバーロードしなければならないのはなぜですか? これは、さまざまなプラットフォームの実装と互換性がありstd::vectorますか? このような const PODS を持つのは間違っていると思いますか? それらを非定数のままにしておく必要がありますか?

4

2 に答える 2

3

std::vector代入できない over a 型を作成するのは、未定義の動作です。constメンバーに POD を割り当てることはできません。

于 2012-10-22T16:56:55.333 に答える
0

あなたはいくつかの質問をします:

これは、作成後にポッド メンバーを変更することに関心がないポッドを定義するための正しいアプローチですか?

作成後にポッド メンバーを変更すること関心があるため、質問の形式が正しくありません。を使用すると、たとえば、代入演算子を介してオブジェクトのすべてのメンバーを変更する許可をstd::vector求めることになります。vector::resize()

また、他の人が指摘しているように、あなたoperator=はあまり意味がありません。それは確かにあなたが思っていることをしません。具体的には、式 の後a=b、 のメンバーaは変更されません。

コピー コンストラクターを定義し、代入演算子をオーバーロードしなければならないのはなぜですか?

を使用しているからですstd::vector。C++2003、§23.1/3、「これらのコンポーネントに格納されているオブジェクトの型は、型の要件とCopyConstructible 型の追加要件を満たす必要がありAssignableます。」を検討してください。

実際にvectorは、メモリ管理を行っている間にオブジェクトを移動できる必要があるためです。

これは、さまざまなプラットフォームの実装と互換性がありstd::vectorますか?

はい。の実装でstd::vectorは、型は CopyConstructible および Assignable でなければなりません。

このような const PODS を持つのは間違っていると思いますか?

はい、意図した使用法と矛盾します。それらを変更するベクトルに配置するつもりです。

それらを非定数のままにしておく必要がありますか?

はい。それらを非 const のままにしておくと、ユーザー定義のコピー コンストラクターもユーザー定義の代入演算子も必要ありません。

于 2012-10-22T17:07:59.857 に答える