Фон
При вставке std::pair<uint64_t, uint64_t>
в C ++ std::map<uint64_t, int>
ни компилятор, ни программа не жалуются, даже если переданные значения невозможны для типа данных uint64_t
.
Другими словами, сужающее преобразование из std::pair<uint64_t, uint64_t>(2, -2)
не работает и по умолчанию имеет тип карты std::map<uint64_t, int>
Код
Когда я компилирую и выполняю следующий код с g++ -Wall -Wconversion -Wextra -pedantic test/test_wrong_insert.cpp && ./a.out
:
#include<map>
#include<iostream>
void print_map(std::map<uint64_t, int> & m){
std::cout << "The map is now: {";
for (const auto & n: m){
std::cout << '(' << n.first << ',' << n.second << ") ";
}
std::cout << "}\n";
}
int main(){
std::map<uint64_t, int> m;
auto ret = m.insert(std::pair<uint64_t, uint64_t>(2,-2));
std::cout << "Tried to insert std::pair<uint64_t, uint64_t>(2,-2). ";
std::cout << "Return: " << ret.second << '\n';
print_map(m);
}
Результат
... это вывод:
Tried to insert std::pair<uint64_t, uint64_t>(2,-2). Return: 1
The map is now: {(2,-2) }
Вопрос
Почему std::pair<uint64_t,uint64_t> x{-1,-2}
не выдает ошибку, и как мне заставить ее вызвать ошибку?