В VS2015 и VS2017 это компилируется без предупреждения и генерирует нарушение доступа, которое невозможно поймать и сбой приложения. Очевидно, что int 0 молча преобразуется в нулевой указатель, который затем считается, что он указывает на строку, которая, следовательно, сбой.
#include <string>
#include <iostream>
void crash(const std::string& s) {}
int main()
{
try
{
crash(0);
}
catch (const std::exception& ex)
{
// never gets here!
std::cout << "got" << ex.what() << std::endl;
}
}
Как я могу отловить и восстановить из такого исключения? Если я сброшу const из параметра функции, он не компилируется - так что, возможно, один из способов защитить пользователей от неправильного использования, но я потерял бы защиту, предоставляемую const, или же я? Какая наилучшая практика для написания прототипов, которые избегают этой проблемы?