5

私は、標準 ( ISO/IEC 14882:2011(E)の§3.9/4) の次の段落に興味をそそられます。

type のオブジェクトのオブジェクト表現は、 typeのオブジェクトによって取り上げられるN 個Tのオブジェクトのシーケンスです。ここで、Nは等しいです。オブジェクトの値表現は、 type の値を保持するビットのセットです。自明にコピー可能な型の場合、値の表現は、実装定義の値のセットの 1 つの離散要素であるvalueを決定するオブジェクト表現のビットのセットです。42 unsigned charTsizeof(T)T

オブジェクト表現の一部がオブジェクトの値に関与しないようにするために、オブジェクト表現値表現が異なることを理解しています (パディングなど)。ただし、自明にコピー可能な型についてはよくわかりません。自明ではないコピー可能な型には値がありませんか? 自明でないコピー可能型の値表現の一部は、そのオブジェクト表現の外に存在できますか?

注42は次のように説明しています。

その意図は、C++ のメモリ モデルが ISO/IEC 9899 プログラミング言語 C のメモリ モデルと互換性があることです。

ただし、前のステートメントが単純にコピー可能な型のみを対象としている理由はまだわかりません。これにはどのような意味がありますか?

4

1 に答える 1

7

標準的な例は、リソースを管理するクラスです。

struct Foo
{
    Bar * p;

    Foo() : p(new Bar) { }
    ~Foo() { delete p; }

    // copy, assign
};

型のオブジェクトにはFoo値がありますが、その値はオブジェクト表現 (pこの場合は の値) をコピーしてもコピーできません。タイプのオブジェクトをコピーするにはFooコピーする必要があります。これは、「オブジェクトがポインティを所有している」という意味です。したがって、適切なコピーには、適切なユーザー定義のコピー コンストラクターが必要です。

Foo::Foo(Foo const & rhs) : p(new Bar(*rhs.p)) { }

型のオブジェクトのFooオブジェクト表現は、そのようなオブジェクトのコピーのオブジェクト表現とは異なりますが、値は同じです。

対照的に、オブジェクト表現が一致するとすぐに、 の値intは別の値と同じになります。int(パディングにより、これは必要条件ではありませんが、十分な条件です。)

于 2012-10-07T23:18:08.520 に答える