Connecting Tech Pros Worldwide Forums | Help | Site Map

ifstream/string ctor

Chris Forone
Guest
 
Posts: n/a
#1: Dec 16 '07
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
}
}

James Kanze
Guest
 
Posts: n/a
#2: Dec 16 '07

re: ifstream/string ctor


On Dec 16, 10:03 am, Chris Forone <4...@gmx.atwrote:
Quote:
why have i to bracket the second ctor param in the following example?
Quote:
#include <fstream>
#include <iterator>
Quote:
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<charas first argument, a pointer to
a function returning an istream_iterator<charas 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:james.kanze@gmail.com
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
Chris Forone
Guest
 
Posts: n/a
#3: Dec 16 '07

re: ifstream/string ctor


James Kanze schrieb:
Quote:
On Dec 16, 10:03 am, Chris Forone <4...@gmx.atwrote:
Quote:
>why have i to bracket the second ctor param in the following example?
>
Quote:
>#include <fstream>
>#include <iterator>
>
Quote:
>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<charas first argument, a pointer to
a function returning an istream_iterator<charas 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:james.kanze@gmail.com
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
James Kanze
Guest
 
Posts: n/a
#4: Dec 17 '07

re: ifstream/string ctor


On Dec 16, 12:01 pm, Chris Forone <4...@gmx.atwrote:
Quote:
James Kanze schrieb:
Quote:
Quote:
On Dec 16, 10:03 am, Chris Forone <4...@gmx.atwrote:
Quote:
why have i to bracket the second ctor param in the
following example?
Quote:
Quote:
Quote:
#include <fstream>
#include <iterator>
Quote:
Quote:
Quote:
int main()
{
std::ifstream file(__FILE__);
Quote:
Quote:
Quote:
if (file.is_open())
{
noskipws(file);
std::string text(std::istream_iterator<char>(file),
(std::istream_iterator<char>())); // extra brackets here
}
}
Quote:
Quote:
You don't. You can bracket the first instead:-).
Quote:
Quote:
If you bracket neither, of course, you've declared a function
taking an istream_iterator<charas first argument, a pointer to
a function returning an istream_iterator<charas 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.)
Quote:
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).
Quote:
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.)

--
James Kanze (GABI Software) email:james.kanze@gmail.com
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
Chris Forone
Guest
 
Posts: n/a
#5: Dec 18 '07

re: ifstream/string ctor


James Kanze schrieb:
Quote:
On Dec 16, 12:01 pm, Chris Forone <4...@gmx.atwrote:
Quote:
>James Kanze schrieb:
>
Quote:
Quote:
>>On Dec 16, 10:03 am, Chris Forone <4...@gmx.atwrote:
>>>why have i to bracket the second ctor param in the
>>>following example?
>
Quote:
Quote:
>>>#include <fstream>
>>>#include <iterator>
>
Quote:
Quote:
>>>int main()
>>>{
>>> std::ifstream file(__FILE__);
>
Quote:
Quote:
>>> if (file.is_open())
>>> {
>>> noskipws(file);
>>> std::string text(std::istream_iterator<char>(file),
>>> (std::istream_iterator<char>())); // extra brackets here
>>> }
>>>}
>
Quote:
Quote:
>>You don't. You can bracket the first instead:-).
>
Quote:
Quote:
>>If you bracket neither, of course, you've declared a function
>>taking an istream_iterator<charas first argument, a pointer to
>>a function returning an istream_iterator<charas 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.)
>
Quote:
>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).
>
Quote:
>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.)
>
--
James Kanze (GABI Software) email:james.kanze@gmail.com
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
Closed Thread