Cout поток идет плохо

0

Я просто попробовал этот образец кода С++ 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;
}
  • 0
    Как std::cout испортится? Кроме того, у вас есть неопределенное поведение в вашем коде, когда вы пытаетесь напечатать строку nullptr . Да, в системе , где int8_t основана на char (что почти все системы сегодня) , то выходной оператор << думает , что вы пытаетесь напечатать строку.
  • 0
    Спасибо Иоахим. Я понимаю, что ты имеешь в виду.
Показать ещё 3 комментария
Теги:
c++11
initializer-list

1 ответ

4
Лучший ответ
int8_t* c{};

Здесь вы инициализировали c до nullptr.

Скорее всего, int8_t является typdef для (signed) char на вашей платформе. В этом случае у вас есть неопределенное поведение в вашем примере, потому что вы нарушаете требования operator<< перегрузка, которая принимает (signed) char const *, что требует, чтобы указатель не был пустым.

Из § 27.7.3.6.4/3 [ostream.inserters.character]

Требуется: s не должно быть нулевым указателем.

  • 0
    int8_t , если он существует, должен быть typedef для signed char (или, возможно, обычного char , если нет возможности того, чтобы обычный char был без знака). Там действительно нет причин использовать его, если вы не хотите, чтобы ваша компиляция провалилась на некоторых системах.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню