Скажи, у меня есть этот кусок кода.
#include <string>
int main()
{
std::string(0);
return 0;
}
Пишу std::string(0)
результаты в std::basic_string<char>::basic_string(const char*)
будучи призванным, с 0
в качестве аргумента этого конструктора, который пытается рассматривать аргумент как указатель на C-строку.
Запуск этого кода, очевидно, приводит к std::logic_error
быть брошенным Но мой вопрос таков: почему и GCC, и MSVC 8.0 не выдают никаких предупреждений? Я ожидаю увидеть что-то вроде «Создание указателя из целого числа без приведения».
0
является выражением целочисленной константы со значением 0, так что это константа нулевого указателя. Использование 0-значной константы в качестве нулевого указателя не является приведением.
C ++ 11 вводит nullptr
(а также nullptr_t
), но лечение 0
поскольку нулевой указатель вряд ли изменится в ближайшем будущем, так как от него зависит большое количество кода.
Потому что эти компиляторы, похоже, упускают эту функцию. Рекомендую написать им репортаж.
Компилятор может легко распознать класс строки std внутри и выдать разумное предупреждение.
Я не знаю, почему вы хотите ограничить предупреждение только для случаев без броска. Наличие там приведения или иным образом передача нулевого указателя одинаково бессмысленны.