Мне кажется, что в стандарте С++ существует несогласованность, в частности в §30.7.5.2.4 проекта С++ 17 (N4659), о том, когда символы расширяются в форматированных выводах на выходных потоках ( operator<<()). Точно такая же несогласованность, по-видимому, отражена в en.cppreference.com.
Сначала предположим следующие объявления:
std::ostream out;
std::wostream wout;
char ch;
wchar_t wch;
const char* str;
const wchar_t* wstr;
Затем утверждается, что
-
out << chне выполняет расширение символов, -
out << strвыполняет расширение символа, -
wout << chвыполняет расширение символов, -
wout << strвыполняет расширение символов, -
wout << wchне выполняет расширение символов, -
wout << wstrвыполняет расширение символов.
Первая и самая очевидная несогласованность заключается в том, что (6) не может быть истинным, так как нет функции widen(), принимающей аргумент wchar_t, только один, который принимает аргумент char.
Вторая (кажущаяся) несогласованность находится между (1) и (2). Мне кажется странным, что out << "x" должен расширять 'x', а out << 'x' не должен.
Я неправильно интерпретирую стандартный текст, или там что-то не так? Если последнее верно, знаете ли вы, что такое предполагаемое поведение?
EDIT: По-видимому, эта несогласованность (если я прав) присутствует в стандарте, поскольку, по крайней мере, С++ 03 (§27.6.2.5.4). Текст немного меняется через промежуточные стандарты, но несогласованность, как я объясняю выше, остается.