3

次のことを移植可能に行うことは可能ですか:

struct structure {
    structure() {}
private:
    // only allow container copy construct
    structure(const structure&) {}
    // in general, does not work because allocator (not vector) calls copy construct
    friend class std::vector<structure>;
};

上記のコンパイルを試みるメッセージの例:

In member function void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) 
[with _Tp = kernel_data<const double*>::block]:
...
/usr/include/c++/4.3/ext/new_allocator.h:108: error: within this context

ありがとう

回避策はありますが、これがどのように可能になるのか興味があります

4

1 に答える 1

4

いいえvector(より正確には、 に渡されたアロケーターvector) は、構築のタスクをフリー関数または別のクラスに委譲し、friendship を役に立たなくすることができます。

独自のアロケータを渡しても、実装内部のクラスに再バインドされる場合があります。次に、クラスのコンストラクターは、アロケーターではなく、そのクラスからアクセスできますしたがって、それが回避策である場合、保証されていません。(GCC の実装を見ても、非リバウンド アロケータを慎重に使用して、そのようなサブオブジェクトを構築しています。)

GCC の libstdc++ では、STL コンテナ テンプレートは標準クラスまたは関数のスコープに含まれるオブジェクトを構築しません。

于 2010-05-25T18:40:18.683 に答える