Я просто попробовал этот образец кода С++ 11 и понял, что поток cout идет не так, и я должен явно очистить бит bad/fail, потому что последняя инструкция cout печатается.
Кто-нибудь здесь испытал это? или я чего-то не хватает??
#include <cstdint>
#include <vector>
#include <string>
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int8_t* c{};
cerr << boolalpha << (!cout) << endl;
cout << c << endl;
cerr << boolalpha << (!cout) << endl;
//cout.clear(); //Why does cout go bad??
int16_t arr[] {1, 2, 3, 4, 5};
cout << "arr size: " << sizeof(arr)/sizeof(arr[0]) << endl;
return 0;
}
int8_t* c{};
Здесь вы инициализировали c
до nullptr
.
Скорее всего, int8_t
является typdef для (signed) char
на вашей платформе. В этом случае у вас есть неопределенное поведение в вашем примере, потому что вы нарушаете требования operator<<
перегрузка, которая принимает (signed) char const *
, что требует, чтобы указатель не был пустым.
Из § 27.7.3.6.4/3 [ostream.inserters.character]
Требуется: s не должно быть нулевым указателем.
int8_t
, если он существует, должен быть typedef для signed char
(или, возможно, обычного char
, если нет возможности того, чтобы обычный char
был без знака). Там действительно нет причин использовать его, если вы не хотите, чтобы ваша компиляция провалилась на некоторых системах.
std::cout
испортится? Кроме того, у вас есть неопределенное поведение в вашем коде, когда вы пытаетесь напечатать строкуnullptr
. Да, в системе , гдеint8_t
основана наchar
(что почти все системы сегодня) , то выходной оператор<<
думает , что вы пытаетесь напечатать строку.