10

カスタム コンテナーのコードを確認していて、その一部で次のような要素が作成されます。

::new( (void*)&buffer[index] ) CStoredType( other );

そして、いくつかは次のようにします:

::new( &buffer[index] ) CStoredType( other );

したがって、両方とも配置 new を使用してコピー コンストラクターを呼び出し、他の要素をコピーして要素を作成しますが、ある場合には新しい要素ストレージへのポインターがそのまま渡され、別の場合には にキャストされvoid*ます。

このキャストvoid*は何か効果がありますか?

4

2 に答える 2

10

はい、非voidポインターの演算子newをオーバーロードできます。キャストにより、voidポインターのオーバーロードが確実に発生します。

例えば

void* operator new(size_t s, env * e);
于 2011-12-09T09:54:41.857 に答える
5

コンパイル可能な例:

#include <iostream>
#include <new>

void* operator new(std::size_t, int* x)
{
    std::cout << "a side effect!" << std::endl;

    return x;
}

int main()
{
    int buffer[1];

    new ((void*)&buffer[0]) char;
    new (&buffer[0]) char;
}
于 2011-12-09T10:01:59.160 に答える