3

クラスインスタンスオブジェクトをある場所から別の場所に移動することは許可されていますか (たとえば、std::memcpyorを使用して) std::memove。ソースと宛先の場所の配置が同じであると仮定します。次に、宛先の「オブジェクト」をソースオブジェクトの型にキャストし、 C++11 標準のどの部分がこれを禁止していますか?

4

2 に答える 2

5

それらがis_trivially_copyableである限り、安全です。

§ 3.9.2

自明にコピー可能な型 Tの任意のオブジェクト (基本クラスのサブオブジェクト以外) については、オブジェクトが型 T の有効な値を保持しているかどうかにかかわらず、オブジェクトを構成する基になるバイト (1.7) を char またはの配列にコピーできます。 unsigned char.40 char または unsigned char の配列の内容がオブジェクトにコピーされた場合、オブジェクトはその後元の値を保持する必要があります。

#define N sizeof(T)
char buf[N];
T obj; // obj initialized to its original value
std::memcpy(buf, &obj, N); // between these two calls to std::memcpy,
                           // obj might be modified
std::memcpy(&obj, buf, N); // at this point, each subobject of obj of scalar type
                           // holds its original value

§ 3.9.3

自明にコピー可能な型 Tについて、 T への 2 つのポインターが別個の T オブジェクト obj1 および obj2 を指している場合、ここで obj1 も obj2 も基本クラスのサブオブジェクトではない場合、 obj1 を構成する基礎となるバイト (1.7) が obj2,41 obj2 にコピーされる場合その後、obj1 と同じ値を保持します。[ 例:

T* t1p;
T* t2p;
    // provided that t2p points to an initialized object ...
std::memcpy(t1p, t2p, sizeof(T));
    // at this point, every subobject of trivially copyable type in *t1p contains
    // the same value as the corresponding subobject in *t2p
于 2013-07-13T00:15:12.763 に答える