Wydaje mi się, że istnieje niezgodność w standardzie C++, w szczególności w § 30.7.5.2.4 szkicu C++ 17 (N4659), o tym, kiedy znaki są rozszerzone w sformatowanych operacjach wyjściowych na wyjściowych strumieniach (operator<<()
). Dokładnie ta sama niespójność wydaje się być odzwierciedlona w en.cppreference.com.C++ Kiedy znaki są rozszerzone w operatorze strumienia wyjściowego <<()?
pierwsze, przyjęto następujące deklaracje:
std::ostream out;
std::wostream wout;
char ch;
wchar_t wch;
const char* str;
const wchar_t* wstr;
Następnie stwierdził, że
out << ch
nie wykonać charakter rozszerzający,out << str
wykonuje znak poszerzenie,wout << ch
wykonuje charakter szeroki ning,wout << str
wykonuje znak poszerzenie,wout << wch
nie wykonać charakter rozszerzający,wout << wstr
wykonuje znak poszerza.
Pierwszy i oczywiste jest, że niezgodność (6) nie może być prawdziwe, ponieważ nie ma widen()
funkcja podejmowania wchar_t
argumentu tylko jeden, który wymaga char
argumentu.
Druga (pozorna) niespójność jest pomiędzy (1) i (2). Wydaje mi się dziwne, że out << "x"
powinien poszerzyć się o 'x'
, podczas gdy out << 'x'
nie powinien.
Czy źle interpretuję standardowy tekst, czy coś tam jest nie tak? Jeśli to drugie jest prawdziwe, czy wiesz, jakie jest zamierzone zachowanie?
EDYCJA: Wydaje się, że ta niespójność (jeśli mam rację), była obecna w standardzie od co najmniej C++ 03 (§27.6.2.5.4). Tekst zmienia się nieco poprzez standardy pośrednie, ale niespójność, jak to wyjaśnię powyżej, pozostaje.
To powinien być problem z LWG. –
"... Jeśli c ma typ char, a typ znaku nie jest char, to seq składa się z out.widen (c), w przeciwnym razie seq składa się z c. ..." Sorry, my English (and understanding ogólnie, dlaczego nie) nie jest tak dobry; Czy możesz wskazać jedno ze zdań, w którym znajdziesz niespójności? – Loreto
@Loreto Niespójność nie jest tak naprawdę w jednym zdaniu standardu. Jak opisałem powyżej, (1) i (2) sem są ze sobą w konflikcie, a Dietmar potwierdza, że (1) jest poprawne, i (2) jest błędne (niewłaściwie podąża za błędnym sformułowaniem). –