istream_iterator 使用 std::copy 时无效

istream_iterator invalid when using std::copy

我正在尝试将一些 intsstdin 复制到 vector。我的代码可以正常工作,但我不确定为什么在 copy 的第二个参数之后需要 ()。我的意思是 copy 调用中的 istream_iterator<int>() 参数。

代码在这里...

#include <iterator>
#include <vector>
#include <iostream>

using std::vector;
using std::copy;
using std::cin;
using std::istream_iterator;

int main()
{   
     vector<int> nums;
     copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(nums)); // why do I need the empty brackets after the 2nd argument?

     return 0;
}   

如果我删除括号,我会从编译器中得到一个错误,但是如果我稍微修改我的代码以编写下面的代码,我的程序就可以正常工作。

int main()
{   
     vector<int> nums;
     istream_iterator<int> end; // no brackets used here
     copy(istream_iterator<int>(cin), end, back_inserter(nums)); 

     return 0;
}  

我来自 Java 背景,所以空括号仅表示您使用了空构造函数。第一个代码片段违背了我的理解,根据我对 C++ 的理解,如果你想使用一个空的构造函数,你只是错过了 () 但是这里不是这种情况

求助!

copy(istream_iterator<int>(cin), istream_iterator<int>, back_inserter(nums));

没有意义。 istream_iterator<int> 是类型而不是对象。您需要使用 () 创建类型为 istream_iterator<int>.

的未命名的、临时的、默认构造的对象

正在使用

istream_iterator<int> end;

您声明了一个 istream_iterator<int> 类型的对象,您不需要括号,因为它是默认构造的,没有它们。事实上,如果您使用了括号,例如:

istream_iterator<int> end();

然后你将 运行 变成 most vexing parse 问题,end 现在将是一个不接受任何内容并返回 istream_iterator<int>.

的函数

I have the code working but I'm unsure why I need the () after the second argument of copy

您需要它们就地构造一个迭代器,而不是声明一个单独的变量来表示输入流的最后一个。如果你写

istream_iterator<int>

没有括号,那将是一个类型名称。带括号的是默认构造函数的调用:

istream_iterator<int>()

一个istream_iterator<int>对象就地构建,并作为它的第二个参数传递给std::copy。按照惯例,istream_iterator<T> 的默认构造函数为您提供了一个迭代器的实例,它表示流结束后的一个信号。

这可能令人困惑,但这两种情况都是通过默认构造函数创建对象。对于第一种情况,您必须使用 (),对于第二种情况,您不得使用 ().

istream_iterator<int>() 通过默认构造函数创建一个临时对象。如果没有 ()istream_iterator<int> 只是一个类型名称,这没有意义,因为预期类型的​​实例。

istream_iterator<int> end; 也通过默认构造函数创建一个命名对象。这里不能用(),否则会变成函数声明,不带参数,returnsistream_iterator<int>。参见 Most vexing parse