2013-04-06 10 views
9

驚いたことに、std::vector::get_allocator()をコピーできないアロケータで使用しようとするとエラーが発生します。 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(); 
+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. 

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

私はわかりません理由はですが、これは必須ですが、コピーできないアロケータが許可されていれば、空の基本最適化はもう機能しません。

+0

厳密に言えば、これは、コピー操作が例外を介して終了してはならないと言うだけです。それは可能でなければならないとは言いません。 –

+2

この式は有効でなければならず、この式は 'CopyConstructible'型とまったく同じです。コピーが例外をスローしてはならないので、さらに強力です。 – ipc

+0

「get_allocator()メンバがコピーを返す」という逐語的なテキストより強いわけではありません –

1

標準は、単によう指示:

[C++11: 23.2.1/7]:[..]この節 部材get_allocator(で定義されているすべてのコンテナタイプで)コンテナを構築するために使用されるアロケータのコピーを返しますかそのアロケータを交換した場合、直近の交換のコピー[..]

は私がヴォーンの正しい彼の仮説でアロケータをuであることを意味していること@疑い"ハンドル"としてsed。

非常にルーズの類推では、標準アルゴリズムで使用するためにコピーできないファンクタを書くことはありますか?

+4

しかし、この規格はなぜそんなに言いますか? –

+0

@ゾイドバーグ:誰かがそれが必要であると決めたからです。 Yプロパティを使ってXを作成した理由を合理化しようとすると、スタックオーバーフローに関する建設的ではない話題になります。 –

+0

標準のこの部分を "そのアロケータが置き換えられた場合"どのようにして行いますか? –

関連する問題