5

アトミックを含むマップ内にオブジェクトを構築しようとしているため、コピーも移動もできません。

私のC++リファレンスの読みは、マップemplaceがこれを行うことができるはずだということです。ただし、コンストラクターが削除されているか存在しないため、次のコードはコンパイルされません。使用make_pairしても役に立ちません。

#include <atomic>
#include <unordered_map>

class Z {
  std::atomic<int> i;
};

std::unordered_map<int, Z> map;

void test(void) {
  map.emplace(0, Z()); // error
  map[0] = Z(); // error
}

これは可能ですか、そうでない場合はなぜですか?

編集: コンパイラは Linux の gcc 4.8.1 です

4

3 に答える 3

14

map.emplace(std::piecewise_construct, std::make_tuple(0), std::make_tuple())Zlocation でゼロ引数を構築します0

map[0]まだそこにない場合も実行します。

emplaceを構築するための引数を取りますstd::pair<const K, V>std::pair最初のstd::piecewise_construct_tタプルは最初の引数を構築するために使用され、2 番目は 2 番目の引数を構築するために使用されます。

sostd::pair<const int, Z> test( std::piecewise_construct, std::make_tuple(0), std::make_tuple() )tests 要素をその場でconst int構築し、 は で構築され(0)ます。はZで構築され()ます。

map.emplaceforwards はstd::pairコンストラクタへの引数です。

于 2015-10-29T19:39:52.667 に答える
2

最も簡単な解決策はoperator[]、マップ内で値を構築するために使用することです。次に、値を割り当てる (または必要に応じて操作する) ことができます。

于 2015-10-29T19:41:32.093 に答える
-1

アトミックはコピーできないため、次のソリューションの方がよい場合があります。

class Z {
  std::atomic<int> i;
};

std::unordered_map<int, std::shared_ptr<Z>> map;

void test(void) {
  map.emplace(0, std::make_shared<Z>()); // OK
}
于 2015-10-29T19:52:16.163 に答える