[comp.lang.c++] C++ parsing questions

schmidt@crimee.ics.uci.edu (Doug Schmidt) (05/09/89)

Since people seem in the mood to disambiguate obscure C++ language
design points I have a quick question about the following piece of
code from page 313 in the 1988 USENIX C++ Conference Proceedings.

----------------------------------------
class X
{
public:
  X ();
  X (X& x, int X::*p);
  operator int X::*();
protected:
  int i;
  double d;
};        

f ()
{
  X a;
  int X::* pi_X = a;

  X b = X (a, pi_X);
  X *px = new X (a, b);
  // stuff omitted...        

  a.*pi_X = *px.*b // evaluated as ((*px).*)b.operator int X::*()
}
----------------------------------------

This last line of code does not make any sense to me, especially since
the precedence of the new operators .* and ->* (shown on page 311) are
HIGHER than * (i.e., the dereference operator).

Was this just a typo in the article?  Does C++ 2.0 really evaluate
things this way?!?!

thanks,

        Doug
--
On a clear day, under blue skies, there is no need to seek.
And asking about Buddha                +------------------------+
Is like proclaiming innocence,         | schmidt@ics.uci.edu    |
With loot in your pocket.              | office: (714) 856-4043 |

turner@sdti.SDTI.COM (Prescott K. Turner) (05/10/89)

In article <13718@paris.ics.uci.edu> Doug Schmidt <schmidt@crimee.ics.uci.edu> writes:
 X * px;
 ...
>  a.*pi_X = *px.*b; // evaluated as ((*px).*)b.operator int X::*()

>Was this just a typo in the article?  Does C++ 2.0 really evaluate
>things this way?!?!

It's got at least one typo independent of the question you raised.
You can never put a parenthesis between an operator and its operand.
Fixing this gives
  a.*pi_X = *px.*b; // evaluated as (*px).*(b.operator int X::*())

Cfront 1.2, which also supports pointers to members, accepts
  a.*pi_X = (*px).*(b.operator int X::*());
and rejects
  a.*pi_X = *px.*(b.operator int X::*());
so it is very likely that the article meant to say
  a.*pi_X = (*px).*b; // evaluated as (*px).*(b.operator int X::*())
--
Prescott K. Turner, Jr.
Software Development Technologies, Inc.
P.O. Box 366, Sudbury, MA 01776 USA         (508) 443-5779
UUCP: ...{harvard,mit-eddie}!sdti!turner    Internet: turner@sdti.sdti.com

rfg@riunite.ACA.MCC.COM (Ron Guilmette) (05/14/89)

In article <455@sdti.SDTI.COM> turner@sdti.UUCP (0006-Prescott K. Turner, Jr.) writes:
>You can never put a parenthesis between an operator and its operand.

I think you meant "you can never put a closing parenthesis between an operator and
it operand."   Actually though, I don't believe that this is strictly true either.
For example, aren't these legal?

	(*ptr)++
	(*ptr)--

-- 
// Ron Guilmette  -  MCC  -  Experimental Systems Kit Project
// 3500 West Balcones Center Drive,  Austin, TX  78759  -  (512)338-3740
// ARPA: rfg@mcc.com
// UUCP: {rutgers,uunet,gatech,ames,pyramid}!cs.utexas.edu!pp!rfg