我不了解C ++ getline函数背后的设计决策。
为什么要通过引用将流和字符串作为参数,而只返回传入的相同流?似乎仅将流作为参数,然后返回已读取的字符串似乎更直观。返回相同的流可让您链接呼叫,但是真的有人愿意使用getline(getline(stream, x), y)
吗?
此外,为什么函数不像其他标准库那样位于std
命名空间中?
答案 0 :(得分:4)
如果该函数返回一个字符串,则将无法指示读取失败,因为所有字符串值都是此(或任何其他)函数可以返回的有效值。另一方面,流中有许多错误指示标志,可以由调用getline的代码进行测试。因此人们可以编写如下代码:
while( std::getline( std::cin, somestring )) {
// do stuff with somestring
}
如果getline
返回一个字符串,很难看到如何编写类似的代码。
为什么函数不像其他标准库那样位于std名称空间中?
它在std
命名空间中-是什么让您觉得不一样?
答案 1 :(得分:3)
为什么要通过引用将流和字符串作为参数,而只返回传入的相同流?
这是流库中的常见模式。这意味着您可以在执行操作时测试正在执行的操作。例如:
std::string line;
while(std::getline(std::cin, line))
{
// use line here because we know the read succeeded
}
您还可以通过“链接”流函数来进行简洁的解析器:
std :: string键,值;
if(std::getline(std::getline(in, key, '='), value))
my_map[key] = value;
仅将流作为参数,然后返回已读取的字符串,这似乎更直观。
每次调用都返回一个新字符串的问题是,您不断为其分配新的内存,而不是重用已分配给传入的字符串或在循环中获得的字符串的内存。
// Here line will not need to allocate memory every time
// through the loop. Only when it finds a longer line than
// it has capacity for:
std::string line;
while(std::getline(std::cin, line))
{
// use line here because we know the read succeeded
}