On Wed, Oct 15, 2008 at 09:54:36PM +0300, Lasse Kärkkäinen wrote: > The following problem is very common when dealing with iterators, > function objects and/or algorithms in C++.
Yes, I ran into this issue myself earlier this week. It's a more general problem, striking whenever the arguments to a constructor are themselves constructor calls. > This is a simple test case: > > #include <iostream> > #include <iterator> > #include <string> > > int main() { > using namespace std; > typedef istreambuf_iterator<char> isbi; > string str(isbi(cin), isbi()); // Line 8 > cout << str << endl; // Line 9 > } > ... > The problem here is that the C++ standard requires line 8 to be > interpreted as a declaration of a function named str, returning string > and taking two arguments of type isbi (the first one is named cin and > the second one is anonymous). The extra parenthesis around variable > names are ignored. > > However, since it is not conventional to use parenthesis around variable > names in function declarations, this problem could be analyzed by GCC, > issuing a proper warning. Good idea. > My suggestion: > > Whenever a function declaration with parenthesis around parameter names > is seen, issue a warning: > > <file>:<lineno>: warning: '<symbolname>' is interpreted as a function > declaration, but it looks like a variable definition (put parenthesis > around '<first argument>' to make it so) But the wording of the warning needs work, as "make it so" is ambiguous here. Perhaps <file>:<lineno>: warning: '<symbolname>' is interpreted as a function declaration; put parentheses around the first argument to make it a variable definition Another way to get the correct interpretation is to write string str = string(isbi(cin), isbi()); > Note: the case of variable initialization without arguments (also > interpreted as a function declaration) cannot be diagnosed in this > manner. Therefore no warning should be issued on this: string str(); > People generally learn to write just string str; rather quickly. string str(); looks like a function declaration, so users are less likely to write this when declaring a string.