9

テキスト ファイルから行を読み取る標準的な方法は次のとおりです。

std::fstream fs("/tmp/myfile.txt");
std::string line;
while (std::getline(line, fs)) {
   doThingsWith(line);
}

(いいえ、そうではありません while (!fs.eof()) { getline(line, fs); doThingsWith(line); }!)

これstd::getlineは、参照によってストリーム引数を返すため、次の理由で機能します。

  • C++03 では、エラー フラグが設定され ている場合、ストリームはinvoid*を介してに変換され、null ポインター値に評価されます。operator void*() conststd::basic_iosfail
    • [C++03: 27.4.4][C++03: 27.4.4.3/1]を参照してください
  • C++11 では、ストリームは in を介して に変換され、エラー フラグが設定されたときにboolに評価 されます。explicit operator bool() conststd::basic_iosfalsefail
    • 見る[C++11: 27.5.5.1][C++11: 27.5.5.4/1]

C++03 では、このメカニズムは次のことが可能であることを意味します。

std::cout << std::cout;

これにより、任意のポインタ値が標準出力ストリームに出力されます。

ただし、operator void*() constC++11 で削除されたにもかかわらず、これは C++11 モードの GCC 4.7.0 でもコンパイルおよび実行されます。

これは C++11 でもどのように可能ですか? 私が気付いていない他のメカニズムが働いているのでしょうか? それとも単に実装の「奇妙さ」ですか?

4

3 に答える 3

6

遅くとも GCC 4.6.2の libstdc++ コードbasic_iosは、明らかに C++03 に似ています。

私はこれを単に「彼らはまだそれに慣れていない」と言いたい.

対照的に、libc++ (LLVM の stdlib 実装) トランクは既にoperator bool().

于 2013-02-02T03:30:57.250 に答える
2

これは、既存のヘッダーに埋め込まれた、見逃されていたミニ機能でした。2011年以前のコンポーネントには、おそらく多くの欠落と手数料のエラーがあります。

実際、誰かがgccでこのようなことを思いついた場合、Bugzillaにアクセスしてバグレポートを作成するのは良い世界です。優先度の低いバグかもしれませんが、紙の証跡を開始した場合

私は手足に出て、このアイデアを他のすべてのC ++コンパイラー(clangVisual Studioなど)に拡張します。

これにより、C++がより適切な場所になります。

PS私はBugzillaにバグを入力しました。

于 2013-02-03T15:55:33.330 に答える