ifstream/string ctor

C

Chris Forone

hello group,

why have i to bracket the second ctor param in the following example?

thx & hand, chris

#include <fstream>
#include <iterator>

int main()
{
std::ifstream file(__FILE__);

if (file.is_open())
{
noskipws(file);
std::string text(std::istream_iterator<char>(file),
(std::istream_iterator<char>())); // extra brackets here
}
}
 
J

James Kanze

why have i to bracket the second ctor param in the following example?
#include <fstream>
#include <iterator>
int main()
{
std::ifstream file(__FILE__);

if (file.is_open())
{
noskipws(file);
std::string text(std::istream_iterator<char>(file),
(std::istream_iterator<char>())); // extra brackets here
}
}

You don't. You can bracket the first instead:).

If you bracket neither, of course, you've declared a function
taking an istream_iterator<char> as first argument, a pointer to
a function returning an istream_iterator<char> as second
argument, and returning an string. Which is, of course, also
legal (and your exact code compiles with my compiler), but
probably not what you wanted. (I presume that in the code which
actually triggers the error, you tried to use text later, as if
it were a string, and not a function.)
 
C

Chris Forone

James said:
You don't. You can bracket the first instead:).

If you bracket neither, of course, you've declared a function
taking an istream_iterator<char> as first argument, a pointer to
a function returning an istream_iterator<char> as second
argument, and returning an string. Which is, of course, also
legal (and your exact code compiles with my compiler), but
probably not what you wanted. (I presume that in the code which
actually triggers the error, you tried to use text later, as if
it were a string, and not a function.)

--
James Kanze (GABI Software) email:[email protected]
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
thx,

if i understand it right, w/o brackets its a declaration of a function,
w brackets its one of the string-ctors?! in web ive seen examples w/o
brackets, but they didnt compile w g++ 4.1...

best regards, chris
 
J

James Kanze

James Kanze schrieb:
if i understand it right, w/o brackets its a declaration of a
function, w brackets its one of the string-ctors?!

It is a declaration of a variable (an object) with string type.

The basic rule is that if something can be interpreted as a
declaration (rather than as an expression), then it is. So if
you write something like:
std::istream_iterator<char>(file)
it is a declaration (of a variable named file, with type
std::istream_iterator< char >), unless the context where it
appears doesn't allow declarations.

The case of:
std::istream_iterator<char>()
is more complicated, since there is nothing that could be being
declared. But there are a few contexts, such as the declaration
of a function parameter, where you do not need to name what is
being declared. In such cases, this is a declaration of a
function (and as a function parameter, the declaration of a
function is "reinterpreted" as the declaration of a pointer to a
function.

In your code above, but without the braces, if you interpret
these expressions as declarations, you end up with a legal
function declaration. Since they can be interpreted as
declarations, the standard says that they should be, and you
have a legal function declaration. If you put even one in
parentheses, however... a declaration can never appear in
parentheses, so it cannot be a declaration, and must be an
expression (an "explicit type conversion (functional notation)",
according to the standard---the explicit creation of a
temporary, in common parlance). And if even one of them is an
expression, then the complete statement cannot be a function
declaration, which means that the second can't be a declaration
either. And if they're expressions, then the statement must be
the definition of a variable, with direct initialization and two
initializers (which means that the variable will be initialized
by calling the constructor found by overload resolution for the
two expressions).
in web i've seen examples w/o brackets, but they didnt compile
w g++ 4.1...

They shouldn't compile anywhere.

(Note too that you'll find a lot of things on the Web. There's
no requirement that anything be correct for it to appear in a
web page.)
 
C

Chris Forone

James said:
It is a declaration of a variable (an object) with string type.

The basic rule is that if something can be interpreted as a
declaration (rather than as an expression), then it is. So if
you write something like:
std::istream_iterator<char>(file)
it is a declaration (of a variable named file, with type
std::istream_iterator< char >), unless the context where it
appears doesn't allow declarations.

The case of:
std::istream_iterator<char>()
is more complicated, since there is nothing that could be being
declared. But there are a few contexts, such as the declaration
of a function parameter, where you do not need to name what is
being declared. In such cases, this is a declaration of a
function (and as a function parameter, the declaration of a
function is "reinterpreted" as the declaration of a pointer to a
function.

In your code above, but without the braces, if you interpret
these expressions as declarations, you end up with a legal
function declaration. Since they can be interpreted as
declarations, the standard says that they should be, and you
have a legal function declaration. If you put even one in
parentheses, however... a declaration can never appear in
parentheses, so it cannot be a declaration, and must be an
expression (an "explicit type conversion (functional notation)",
according to the standard---the explicit creation of a
temporary, in common parlance). And if even one of them is an
expression, then the complete statement cannot be a function
declaration, which means that the second can't be a declaration
either. And if they're expressions, then the statement must be
the definition of a variable, with direct initialization and two
initializers (which means that the variable will be initialized
by calling the constructor found by overload resolution for the
two expressions).


They shouldn't compile anywhere.

(Note too that you'll find a lot of things on the Web. There's
no requirement that anything be correct for it to appear in a
web page.)

--
James Kanze (GABI Software) email:[email protected]
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
thanks a lot for this professional answer!

best regards, chris
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top