2013-11-07 3 views
8

У меня есть эта функция:возвращение NULL вместо станд :: строки C++

std::string SWindows::PRecv(int rc, std::string* ip); 

В этой функции, в некоторых случаях я вернуть NULL, а код компиляции (IDE: VS 2012). Для меня NULL это не объект std :: string, поэтому мы не можем это записать.

Так почему же правильно возвращать NULL, когда возвращение функции является std :: string?

+3

Возможно, компилятор выбирает конструктор string (const char *). –

ответ

6

Значение NULL равнозначно 0 в C++ и 0 является вполне допустимой константой char const*. Класс string имеет конструктор не explicit, принимающий char const*, то есть компилятор будет компилировать код, но он не будет работать: то есть, хотя компилятор исключает код, это неопределенное поведение.

Глядя на определение в C++ 11 Я не вижу delete д перегрузка принимая std::nullptr_t, то есть, он будет также компилировать при преобразовании из nullptr. Я бы надеялся, что будет перегрузка delete d с использованием std::nullptr_t, которая позволит компилятору поймать ситуацию, по крайней мере, при передаче nullptr.

+0

Большое спасибо за downvote! Не могли бы вы объяснить, почему ответ был отменен? Обратите внимание на «... но это не сработает». (Тем не менее, я буду более ясен об этом в одно мгновение). –

+0

Я не понимаю нисходящий голос. Этот ответ кажется правильным и затрагивает важные моменты. Единственная проблема, которую я вижу, заключается в том, что «не сработает» может быть не столь очевидным с первого взгляда, поэтому, возможно, поверхностные читатели берут на себя ответ, говорит, что 'string (0)' в порядке, когда это фактически UB. –

+2

Да, почему бы кто-нибудь это сделать? А потом вас двое? Я хотел бы знать, где вы не согласны с @Dietmar, потому что вы ошибаетесь (кто бы вы ни были). – stefan

4

Что вы делаете, это создание std::string от char const*, равное 0 (или NULL).

Это фактически запрещен стандарт:

[C++11: 21.4.2/9] Требуется: s не должен быть пустым указателем

Однако GCC является экстра-добр к вам и does checks to make it a no-op. Это не требуется, и вы никогда не должны полагаться на это.

+0

Ничего себе! Это опасно! Но исходный код уже сломан, поэтому я думаю, что все в порядке ... –

Смежные вопросы