Мне кажется, что в стандарте С++ существует несогласованность, в частности в §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). Текст немного меняется через промежуточные стандарты, но несогласованность, как я объясняю выше, остается.