Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > composition of declarators

Reply
Thread Tools

composition of declarators

 
 
ssailor
Guest
Posts: n/a
 
      04-24-2007
I saw an exaple in the c++ standard(clause 6.,

-------------------------------------------------------
struct T1 {
T1 operator ()( int x ) { return T1(x ); }
int operator =( int x ) { return x; }
T1(int ) { }
};
struct T2 { T2(int ){ } };
int a , (*(* b)( T2 ))( int ), c , d;
void ff ()
{
T1(a) = 3 ,
(*(* b)( T2(c )))( int(d )); // AA
}
--------------------------------------------

I am confused that the declaration at the line AA is valid.
Then, what's the meaning of this declaration? Thank in advance.

 
Reply With Quote
 
 
 
 
Victor Bazarov
Guest
Posts: n/a
 
      04-24-2007
ssailor wrote:
> I saw an exaple in the c++ standard(clause 6.,
>
> -------------------------------------------------------
> struct T1 {
> T1 operator ()( int x ) { return T1(x ); }
> int operator =( int x ) { return x; }
> T1(int ) { }
> };
> struct T2 { T2(int ){ } };
> int a , (*(* b)( T2 ))( int ), c , d;
> void ff ()
> {
> T1(a) = 3 ,
> (*(* b)( T2(c )))( int(d )); // AA
> }
> --------------------------------------------
>
> I am confused that the declaration at the line AA is valid.


It is.

> Then, what's the meaning of this declaration? Thank in advance.


The second part of the declaration declares 'b' to be a pointer
to a function that takes one argument of type 'int' and returns
a pointer to a function that takes one argument of type T2 and
returns T1. 'c' and 'd' are names of the formal arguments and
do not add meaning to the declaration. The fact that they are
in parentheses does not matter.

In the example in the subclause 6.8 of the Standard the
declaration of 'b' is preceded by another declaration of 'T2'
which masks the type name, thus making parsing of the 'b'
declaration improper, and the code ill-formed. That's at least
AIUI. No diagnostic is required, though. Online trial of
Comeau compiles either code without a problem.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask


 
Reply With Quote
 
 
 
 
ssailor
Guest
Posts: n/a
 
      04-24-2007
Victor Bazarov Wrote:
> 'c' and 'd' are names of the formal arguments and
> do not add meaning to the declaration. The fact that they are
> in parentheses does not matter.

I took for granted that T2(c ), int(d ) were function-style casts
instead of function parameter declarations. This is the cause of my
confusion.

Thanks again for your clarification.

 
Reply With Quote
 
Sylvester Hesp
Guest
Posts: n/a
 
      04-24-2007

"Victor Bazarov" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> ssailor wrote:
>> I saw an exaple in the c++ standard(clause 6.,
>>
>> -------------------------------------------------------
>> struct T1 {
>> T1 operator ()( int x ) { return T1(x ); }
>> int operator =( int x ) { return x; }
>> T1(int ) { }
>> };
>> struct T2 { T2(int ){ } };
>> int a , (*(* b)( T2 ))( int ), c , d;
>> void ff ()
>> {
>> T1(a) = 3 ,
>> (*(* b)( T2(c )))( int(d )); // AA
>> }
>> --------------------------------------------
>>
>> I am confused that the declaration at the line AA is valid.

>
> It is.
>
>> Then, what's the meaning of this declaration? Thank in advance.

>
> The second part of the declaration declares 'b' to be a pointer
> to a function that takes one argument of type 'int' and returns
> a pointer to a function that takes one argument of type T2 and
> returns T1.


Actually, it is the other way around: it is a function pointer taking a T2
and returning a pointer to a function taking an int and returning a T1.

The funny thing is, if you replace the comma on the previous line with a
semi-colon, it actually becomes a double function call: first on the
function pointed to by the earlier defined 'b', passing a T2 constructed out
of c, and another function call on the function returned by b(), passing an
int constructed out of d)

- Sylvester Hesp


 
Reply With Quote
 
Victor Bazarov
Guest
Posts: n/a
 
      04-24-2007
Sylvester Hesp wrote:
> "Victor Bazarov" <(E-Mail Removed)> wrote in message
> news:(E-Mail Removed)...
>> ssailor wrote:
>>> I saw an exaple in the c++ standard(clause 6.,
>>>
>>> -------------------------------------------------------
>>> struct T1 {
>>> T1 operator ()( int x ) { return T1(x ); }
>>> int operator =( int x ) { return x; }
>>> T1(int ) { }
>>> };
>>> struct T2 { T2(int ){ } };
>>> int a , (*(* b)( T2 ))( int ), c , d;
>>> void ff ()
>>> {
>>> T1(a) = 3 ,
>>> (*(* b)( T2(c )))( int(d )); // AA
>>> }
>>> --------------------------------------------
>>>
>>> I am confused that the declaration at the line AA is valid.

>>
>> It is.
>>
>>> Then, what's the meaning of this declaration? Thank in advance.

>>
>> The second part of the declaration declares 'b' to be a pointer
>> to a function that takes one argument of type 'int' and returns
>> a pointer to a function that takes one argument of type T2 and
>> returns T1.

>
> Actually, it is the other way around: it is a function pointer taking
> a T2 and returning a pointer to a function taking an int and
> returning a T1.


Right. My mistake.

>
> The funny thing is, if you replace the comma on the previous line
> with a semi-colon, it actually becomes a double function call: first
> on the function pointed to by the earlier defined 'b', passing a T2
> constructed out of c, and another function call on the function
> returned by b(), passing an int constructed out of d)


The funnier thing is, if you drop 'T1' from the line above, the
entire statement becomes executable, assigning 3 to 'a' and then
calling 'b' and the other function as you described.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Question about array declarators Francis Moreau C Programming 11 06-23-2009 07:12 AM
array declarators borophyll@gmail.com C Programming 5 09-24-2007 04:28 PM
Are declarators optional? chandanlinster C Programming 2 02-01-2007 08:21 PM
Variables as array size declarators. Ayaz Ahmed Khan C++ 8 02-29-2004 07:11 PM
Mozilla Mail composition spaces on screen quincey cavenaugh Firefox 8 02-14-2004 06:01 PM



Advertisments