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

12

问题是它{1, 1}不是表达式,也没有类型。由于它没有类型,因此不能推导出到模板参数列表中。它们都不正确,因为问题与提供的参数数量无关。

于 2014-06-15T12:32:27.780 回答
7

我什至不明白 - 这段代码有什么问题?

由于某些模糊的原因,初始化器列表参数是非推导上下文,请参阅初始化器列表和模板类型推导。这是因为 C++11 标准的 § 14.8.2.5/5 是这样说的。我也不知道这种看似不一致和违反直觉的行为的理由,但我们并不孤单:

至于您的情况,也许最简单的解决方法是:

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