Рассмотрим фрагмент:
#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 < 4.9 принимает это без жалоб,
- Clang 3.5 с libstdС++ терпит неудачу с похожим сообщением,
- Clang 3.5 с libС++ принимает это,
- ICC 15.что-то принимает это (не уверен, какую стандартную библиотеку он использует).
Еще несколько озадачивающих пунктов:
- замена
std::unordered_map
наstd::map
заставляет ошибку уйти, - замена
foo({})
на foofoo({{}})
также заставляет ошибку уйти.
Кроме того, замена {}
непустым списком инициализаторов работает как ожидалось во всех случаях.
Итак, мои основные вопросы:
- кто здесь? Правильно ли сформирован код?
- Что делает синтаксис с двойными фигурными фигурными скобками
foo({{}})
, чтобы сделать ошибку?
EDIT зафиксировал пару опечаток.