Почему конструирование std :: string (0) не выдает предупреждение компилятора?

Скажи, у меня есть этот кусок кода.

#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 не выдают никаких предупреждений? Я ожидаю увидеть что-то вроде «Создание указателя из целого числа без приведения».

3

Решение

0 является выражением целочисленной константы со значением 0, так что это константа нулевого указателя. Использование 0-значной константы в качестве нулевого указателя не является приведением.

C ++ 11 вводит nullptr (а также nullptr_t), но лечение 0 поскольку нулевой указатель вряд ли изменится в ближайшем будущем, так как от него зависит большое количество кода.

9

Другие решения

Потому что эти компиляторы, похоже, упускают эту функцию. Рекомендую написать им репортаж.

Компилятор может легко распознать класс строки std внутри и выдать разумное предупреждение.

Я не знаю, почему вы хотите ограничить предупреждение только для случаев без броска. Наличие там приведения или иным образом передача нулевого указателя одинаково бессмысленны.

1