【发布时间】:2015-01-12 21:21:38
【问题描述】:
考虑sn-p:
#include <unordered_map>
void foo(const std::unordered_map<int,int> &) {}
int main()
{
foo({});
}
使用 GCC 4.9.2 失败并显示以下消息:
map2.cpp:7:19: error: converting to ‘const std::unordered_map<int, int>’ from initializer list would use explicit constructor ‘std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type, const hasher&, const key_equal&, const allocator_type&) [with _Key = int; _Tp = int; _Hash = std::hash<int>; _Pred = std::equal_to<int>; _Alloc = std::allocator<std::pair<const int, int> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type = long unsigned int; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hasher = std::hash<int>; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_equal = std::equal_to<int>; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::allocator_type = std::allocator<std::pair<const int, int> >]’
使用其他编译器/库实现进行测试:
- GCC
- 带有 libstdc++ 的 Clang 3.5 失败并显示类似消息,
- 带有 libc++ 的 Clang 3.5 接受这一点,
- ICC 15.something 接受这个(不确定它使用的是哪个标准库)。
还有几个令人困惑的地方:
- 将
std::unordered_map替换为std::map会使错误消失, - 将
foo({})替换为 foofoo({{}})也会使错误消失。
此外,用非空初始化列表替换 {} 在所有情况下都可以正常工作。
所以我的主要问题是:
- 谁在这里?上面的代码格式正确吗?
- 带有双花括号
foo({{}})的语法究竟是如何使错误消失的?
EDIT 修正了几个错别字。
【问题讨论】: