マップ上の std::for_each がコピー コンストラクターを呼び出すのはなぜですか?[重複]
質問
次の簡単な例があります。この中で呼び出したいのは、 std::for_each
コピー不可能なオブジェクトのコレクションに対して:
class A {
public:
A() : x(0) {}
A(const A&) = delete;
private:
int x;
};
void func() {
std::vector<A> v(10);
std::map<int, A> m;
// works as expected
std::for_each(begin(v), end(v), [](const A& a) { /* do nothing */ });
// error calling copy constructor
std::for_each(begin(m), end(m), [](const std::pair<int, A>& a) { /* do nothing */ });
}
すべてを一つに入れたら std::vector
, 、期待どおりに機能しますが、 std::map
, 、 突然 std::for_each
(削除された) コピー コンストラクターを呼び出したいと考えています。なぜ?私は、必要なコピーを必要とせず、マップに保存されているペアへの参照を取得するだけだと思っていたでしょう。
解決
問題はそれです std::map
があります std::pair<const Key, Value>
内部値の型として。標準ライブラリ コンテナでは、これを明示的に指定するのではなく、コンテナ タイプからこれを抽出できます。
C++11 では (C++98 と同じですが、内部でラムダではなく関数オブジェクトを使用する必要があります) for_each
, 、また使用します typedef
の代わりに using =
):
using value_type = std::map<int, A>::value_type;
std::for_each(begin(m), end(m), [](value_type const& a) { /* do nothing */ });
C++14 では次のようにします。
std::for_each(begin(m), end(m), [](auto const& a) { /* do nothing */ });
の用法 auto
ラムダの内部は、Clang 3.4、Visual Studio 2013 November CTP、および GCC 4.9 でサポートされています。
所属していません StackOverflow