3

私のプログラムでは

stringstream strumien(); //1
stringstream strumien;  // 2
strumien<<"napis "<<8<<endl;

最初の行は次のエラーを生成します

タイプ 'std::stringstream() {aka std::basic_stringstream()}' および 'const char [7]' からバイナリ 'operator<<' への無効なオペランド

しかし、2番目のものは適切に機能します。(もちろん、常にそのうちの 1 つがコメントアウトされています)
では、それらの違いは何ですか? なぜなら、それらはオブジェクトの同等の定義であると常に考えていたからです。

4

3 に答える 3

1

最初の行は実際には宣言です。2番目と同じように見えても、そうではありません...

そう

T name();

name型のオブジェクトを返す関数を宣言Tします。

C++ 標準では、このあいまいさが次のように述べられています。

6.8 あいまいさの解決 [stmt.ambig]

式ステートメントと宣言を含む文法にはあいまいさがあります。左端の部分式として関数スタイルの明示的な型変換を使用する式ステートメントは、最初の宣言子が ( で始まる宣言と区別できない場合があります。これらの場合、ステートメントは宣言です。

このあいまいさは、最も厄介な解析とも呼ばれます。


C++11 以降、これを解決する新しい方法があり、それは統一初期化構文と呼ばれます。

それは次のように機能します:

T name{};
于 2013-08-11T20:19:02.603 に答える