Betrachten Sie dieses Beispiel:
#include
#include
#include
#include
int main()
{
std::string sen = "abc def ghi jkl";
std::istringstream iss(sen);
std::vector // declaration in question
vec(std::istream_iterator(iss),
std::istream_iterator());
std::copy(vec.begin(), vec.end(),
std::ostream_iterator(std::cout, "\n"));
}
Der Compiler wirft einen Fehler beim Aufruf von std::copy
Anforderung nach Element 'begin' in 'vec', der kein Klassentyp ist...
Ich kann den Fehler so umgehen:
std::istream_iterator it_begin(iss);
std::istream_iterator it_end;
std::vector vec(it_begin, it_end);
oder indem ich Klammern um jeden Parameter setze, so wie hier:
std::vector
vec((std::istream_iterator(iss)),
(std::istream_iterator()));
oder sogar mit der neuen einheitlichen Initialisierung in C++11:
std::vector vec { /*begin*/, /*end*/ };
Warum interpretiert der Compiler die Deklaration im Beispiel als Funktionsdeklaration? Ich kenne die Problematik des "most vexing parse", aber ich dachte, das passiert nur bei leeren Parameterlisten. Ich frage mich auch, warum der zweite Workaround funktioniert.