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()接受对流对象的右值引用的存在重载。如果我更改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++ 中缺少的功能之一。

可悲的是,我不知道有任何资源可以准确列出每个实现中缺少的内容。

于 2013-01-29T02:03:50.320 回答