Believe it or not, this line does not declare an instance of std::vector
named results
, calling the constructor taking a begin and end iterator:
std::vector<float> results(std::istream_iterator<int>(actualLineStream),
std::istream_iterator<int>());
This actually declares a function called results
that takes a parameter named actualLineStream
and another unnamed parameter, both of type std::istream_iterator<int>
.
Generally in C++, if something looks like a function, it will be parsed like one; the C++ standard requires it. This is really for backward compatibility with C - but this is so counterintuitive that it even has its own name: the "most vexing parse". Some compilers will even issue a warning if it encounters the most vexing parse.
It is related to the fact that these two lines are not equivalent in C++:
Foo bar; // Declares an instance of Foo named bar
Foo bar(); // Declares a function named bar that takes no parameters and returns a Foo
To fix it, you can add more parentheses around one of the arguments:
// +--------- Note extra parentheses!! ---------+
// | |
// V V
std::vector<float> results((std::istream_iterator<int>(actualLineStream)),
std::istream_iterator<int>());
Or simply declare each iterator separately:
std::istream_iterator<int> resultsBegin(actualLineStream);
std::istream_iterator<int> resultsEnd;
std::vector<float> results(resultsBegin, resultsEnd);
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…