getline 如何在此代码中工作

how getline works in this code

    int function1(string data){
        stringstream ss(data);
        return function2(ss);
    }
    int function2(stringstream& ss){
        string val;
        getline(ss,val,',');
        return stoi(val);
    }

如果我将 function2 更改为

    int function2(stringstream ss){...}

没用。我想知道为什么? 编译错误是

删除函数的使用'std::basic_stringstream<_CharT, _Traits, _Alloc>::basic_stringstream(const std::basic_stringstream<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator]'

另一个问题是我很好奇 getline 的实际工作原理。喜欢下面的代码:

    while(!getline(ss,val,','))
        cout<<val;

getline如何在一次迭代后跟踪迭代器的位置?

定义 int function2(stringstream ss) 需要在 stringstream 上使用已删除的复制构造函数。 stringstream 删除了复制构造函数和复制赋值运算符。 streamstream 允许移动。

getline() 不跟踪流。 stringstream 的 class 定义源自 streambuf,它负责此 minutiae/details。

由于您尝试复制 ss 流,并且使用(相对)新的 C++ 语法删除了复制方法,因此发生了错误。

你不允许复制流,所以你想把它给一个函数,你必须使用引用。

您可以找到一些关于

的信息