Какова стандартная локализация по умолчанию ostream? - PullRequest
1 голос
/ 05 марта 2020

Я использую CLang 8.0 и приведу этот пример кода:

#include <locale>
#include <sstream>
#include <iostream>

struct slash : std::numpunct<char> {
    char do_decimal_point()   const { return '/'; }  // separate with slash
};

int main()
{
    std::ostringstream oss;

    auto slash_locale = std::locale(std::cout.getloc(), new slash);
    std::locale::global( slash_locale );

    oss << 4.5;
    std::cout << oss.str();
}

То, что я получаю, это "4.5". Мой вопрос: это поведение игнорирования локали, написанной в стандарте? Потому что мой коллега использует XCode и заявляет, что там печатается «4/5». Я хотел бы понять, предполагается ли, что это будет определено реализацией, или если стандарт, если моя коллега заявляет правду, нарушается.

1 Ответ

1 голос
/ 05 марта 2020

Стандарт определяет, что при построении basic_stream базовый объект basic_stringbuf объект инициализируется с копией текущей глобальной локали и что результаты использования этой локали будут действовать до тех пор, пока не будет вызван элемент imbue.

30.6.3.1 конструкторы basic_streambuf [streambuf.cons]
basic_streambuf();
1 Эффекты: Создает объект класса basic_streambuf<charT, traits> и инициализирует:
( 1.1) все его объекты-указатели на нулевые указатели,
(1.2) член getloc() для копирования глобальной локали, locale(), во время построения.
2 Примечания: После getloc() элемент инициализируется, результаты вызова функций-членов языкового стандарта и полученных таким образом элементов фасетов можно безопасно кэшировать до следующего вызова этого члена.

Так что в этом случае эффекты изменения глобальной локали должно быть видно, только если oss создано после того изменения.

...