14

サンプルコードは次のとおりです。

#include <unordered_map>

int main() {
    std::unordered_map<int, std::pair<int, int>> map;

    map.emplace(1, {1, 1});

    return 0;
}

emplace()次のような署名がある場所:

template <class... _Args>
pair<iterator, bool> emplace(_Args&&... __args);

gcc、関数が 0 個の引数を期待していることを示しています - 2 個が提供されています。はclang、関数が1つの引数を期待していることを示しています-2が提供されています。

私も理解していません - このコードの問題は何ですか?

4

2 に答える 2

7

私も理解していません - このコードの問題は何ですか?

なんらかの理由で、initializer-list 引数は推定されないコンテキストです。initializer_list とテンプレート型推定 を参照してください。これは、C++11 標準の § 14.8.2.5/5 にそう記載されているためです。この一見一貫性がなく、直感に反する行動の根拠もわかりませんが、私たちだけではありません。

あなたの状況に関しては、おそらく最も簡単な修正は次のとおりです。

map.emplace(1, std::make_pair(1, 1));
于 2014-06-15T13:08:54.337 に答える