4

getline()一時ストリーム オブジェクトを使用しようとすると、予期しないコンパイル エラーが発生しました。

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main()
{
    string input = "hello\nworld\nof\ndelimiters";

    string line;
    if (getline(stringstream(input), line)) // ERROR!
    {
        cout << line << endl;
    }
}

getline()ストリーム オブジェクトへの右辺値参照を受け入れる existsのオーバーロードはないようです。左辺値を使用するように変更main()すると、期待どおりにコンパイルおよび実行されます。

int main()
{
    string input = "hello\nworld\nof\ndelimiters";

    string line;
    stringstream ss(inpupt);
    if (getline(ss, line)) // OK
    {
        cout << line << endl;
    }
}

そこで、C++11 標準を調べたところ (§ 21.4.8.9) getline()、ストリーム オブジェクトへの右辺値参照を取るオーバーロードが存在する必要があることがわかりました。

明らかな何かが欠けていますか、それともバグですか? このエラーは、GCC 4.7.2 と Clang 3.2 の両方で発生します。現在、VC でこれをテストすることはできません。

4

1 に答える 1

4

次の行を使用して OS X でコンパイルすると、正常にコンパイルされます。libstdc++ または libc++ のどのバージョンを使用していますか?

clang++ -std=c++11 -stdlib=libc++ foo.cc

libstdc++ (および libc++) は、C++ 2011 標準ライブラリをまだ完全には実装していません。これは、libstdc++ から欠落している関数の 1 つと思われます。

残念ながら、各実装に欠けているものを正確にリストしたリソースを私は知りません。

于 2013-01-29T02:03:50.320 に答える