2017-06-05 7 views
12

C++標準、特にC++ 17草案(N4659)の§30.7.5.2.4に、出力ストリームの書式設定された出力操作で文字が拡大されるときの矛盾があると思われます(operator<<() )。正確に同じ不一致がen.cppreference.comに反映されているようです。C++出力ストリーム演算子<<()で文字が拡大されるのはいつですか?

まず、次の宣言を前提としています

std::ostream out; 
std::wostream wout; 
char ch; 
wchar_t wch; 
const char* str; 
const wchar_t* wstr; 

その後

  1. out << chが文字拡大、
  2. out << str行う文字拡大、
  3. wout << chを行っていないことが述べられていますキャラクタワイドを実行する寧、
  4. wout << str文字拡大、
  5. wout << wchが文字拡大を行っていないを行い、
  6. wout << wstrは、文字拡大を行います。

最初の、そして最も明白な矛盾がwchar_t引数、char引数を取るだけを取って何widen()機能がないので(6)は、真実ではないということです。

第2の(不一致の)不一致は、(1)と(2)の間にあります。 out << "x"'x'を広げて、out << 'x'はすべきではないと私には奇妙に思えます。

標準のテキストを誤解していますか、そこに何か問題がありますか?後者が真実ならば、意図した振る舞いが何であるか知っていますか?

EDIT:明らかに、この矛盾(私が正しい場合)は、少なくともC++ 03(§27.6.2.5.4)以来、この標準に存在しています。テキストは中間的な基準を少し変えますが、私が上で説明したように不整合が残っています。

+2

これはLWGの問題です。 –

+0

"... cがchar型で、ストリームの文字型がcharでない場合、seqは out.widen(c)で構成され、それ以外の場合seqはc ... ..."一般的に、どうしてそうではないか)はあまり良くありません。不一致が見つかった文章の1つを指定できますか? – Loreto

+0

@Loreto矛盾は実際には標準の一文の中にはありません。上記(1)と(2)が矛盾していることをDietmarは確信しており、(1)正しいこと、(2)間違っている(悪い言い方から間違っている) –

答えて

5

標準が完全に正しくないかのように見えます。この問題の大部分は、それぞれの操作の一括仕様に由来しています。個々の過負荷を個別に処理する代わりに、同様の過負荷が一緒に記述され、誤解を招くような仕様になります。

私は疑問に思っていますが、実装者は意図していることを理解するのに問題があります。基本的に、charストリームが非ストリームに挿入されるとき、ストリームの文字タイプの文字を得るために、文字はwiden()である必要があります。この拡張は、ソース文字セットの1文字をストリームのワイド文字セットの1文字にマッピングすることを意図しています。

IOStreams仕様では、ストリーム内のキャラクタが個々のエンティティであるというオリジナルの概念が想定されています。仕様は(C++ 1998版のために)作成されて以来、実質的に更新されていませんでしたが、Unicodeの幅広い使用により、ストリーム内の「文字」は実際にはエンコーディングのバイトです。ストリームはほとんどがこの変更された環境で正常に機能しますが、Unicode文字を処理するのに役立つ柔軟性は実際には適切にサポートされていません。1文字をUTF8バイトのシーケンスに「広げる」何かがないことは、おそらくこれらの1つです。

ストリームのセクションの不一致/不正確さがアドレッシングを保証していると感じる場合は、不具合報告を提出してください。不具合レポートの提出に関する指示はhttp://isocpp.orgです。問題を提起するときは、問題を解決するために提案された言葉遣いを提供することを検討してください。実際に何が意図されているのか明確ではないので、ほとんどの実装が正しいことを行うと思いますが、私はこの問題がかなり優先順位が低くなることを期待しています。もちろん、この問題に対処しても、意図した振る舞いは変わっていません。たとえば、charをUTF8シーケンスに「広げる」ことです。ストリームライブラリの再設計が効果的に行われるが、欠陥解決の

+0

標準では無条件の 'widen'呼び出しが指定されていますが、同じ文字型の場合はスキップされる可能性があります。 –

+0

@ T.C .:必ず。それが固定すべきものだと感じたら、欠陥を起こしてください。仕様が全ての場合に 'widen()'を呼び出すことを要求し終えるならば、 'virtual'関数がちょうど1回呼び出されるように' widen() 'の結果をキャッシュする必要があることをすべての実装者が理解してくれるように、 。 –

+1

確かに、委員会が少なくともiostreamsを完全にオーバーホールするという考え方に有利だと思うのは間違いないと思いますが、そうすることは極めて重要ではありませんので、そのような提案は多くの精査が行われており、成功のための希望があるためには、未解決の、よく知られていない、そして最も矛盾する目標があります。 –

関連する問題