const char* some_string = a_function_that_returns_null();
Вы имеете в виду, что он буквально возвращает нулевой указатель?
[2003: 27.6.2.5.4]:
template<class traits>
basic_ostream<char,traits>& operator<<(basic_ostream<char,traits>& out, const char* s);
3. Требуется: s isненулевой.
Тогда потоковая some_string
- это неопределенное поведение;Вы не можете разыменовать указатель, чтобы получить строку - даже пустую - если указатель недействителен.
Это не происходит постоянно - сотрудник с таким жекод получает все ожидаемые выходные данные
UB приводит к ненадежным симптомам .То, что вы не всегда получаете сбой, может быть немного удивительным, потому что большинство современных ОС всегда стараются, когда вы пытаетесь разыменовать нулевой указатель.
Однако изс точки зрения C ++, может произойти все что угодно ;в вашем конкретном случае ваша стандартная реализация библиотеки вполне может проверять нулевой указатель и устанавливать флаг ошибки в потоке вместо попытки разыменования указателя.Это его прерогатива.
(Вероятно, именно поэтому ваши последующие операции потока терпят неудачу: попытка записи в поток ничего не делает, когда установлен флаг ошибки.)
Например, libstdc ++поставляется с GCC 4.6.0, несмотря на то, что с именем s != 0
в качестве предварительного условия , делает делает это :
00325 if (!__s)
00326 __out.setstate(ios_base::badbit);
00327 else
Однако, вы должны не полагаться на это поведение ;он может изменить в любое время !
Так что просто не делайте этого.Если вам действительно нужно, передайте правильную, но пустую строку.
А что не так с std::string
?