10

驚いたことに、std::vector::get_allocator()コピー不可のアロケータを使用しようとするとエラーが発生しました。std::vector::get_allocator()参照ではなく値で返すのはなぜですか?

template<typename T>
class nc_allocator {
public:
    using value_type = T;

    nc_allocator(nc_allocator const&) = delete;
    nc_allocator& operator=(nc_allocator const&) = delete;

    // Other required members.
};

std::vector<int, nc_allocator<int>> v;
// boom: use of deleted function
//           'nc_allocator<T>::nc_allocator(const nc_allocator<T>&) [with T = int]'
v.get_allocator();
4

2 に答える 2

7

std::vector::get_allocator()コピー不可のアロケータを使用しようとすると、エラーが発生しました。

標準では、そうすることが禁止されています。アロケーターの要件で17.6.3.5は、アロケーターはコピー可能である必要があります。

X a1(a);         Shall not exit via an exception.
                 post: a1 == a
X a1(move(a));   Shall not exit via an exception.
                 post: a1 equals the prior value
                 of a.

したがって、標準で定義されているアロケーターの要件に関して、値による戻りはアロケーターを返す正しい方法です。

なぜこれが必要なのかはわかりませんが、コピー不可能なアロケーターが許可されていた場合、空のベースの最適化は機能しなくなります。

于 2013-04-06T14:12:53.980 に答える
1

標準では、次のように規定されています。

[C++11: 23.2.1/7]: [..]この句で定義されたすべてのコンテナー タイプで、メンバー get_allocator() は、コンテナーの構築に使用されたアロケーターのコピーを返すか、そのアロケーターが置き換えられている場合は、最新の置き換えのコピーを返します[..]

アロケーターは「ハンドル」として使用されることを意図しているという@Vaughnの仮説は正しいと思います。

非常に大雑把な例えですが、標準アルゴリズムで使用するコピー不可能なファンクターを作成することはありますか?

于 2013-04-06T14:15:30.790 に答える