From 3117821978320640442
X-Google-Language: ENGLISH,ASCII-7-bit
X-Google-Thread: f78e5,c42fc9ad8a4a8a45
X-Google-Attributes: gidf78e5,public
X-Google-ArrivalTime: 2003-01-21 08:25:43 PST
Path: archiver1.google.com!news1.google.com!newsfeed.stanford.edu!logbridge.uoregon.edu!kibo.news.demon.net!mutlu.news.demon.net!demon!mail2news.demon.co.uk!devnull
From: gp1@paradise.net.nz (Graeme Prentice)
Newsgroups: comp.std.c++
Subject: Re: Lookup for operators in expressions 13.3.1.2
Date: Tue, 21 Jan 2003 16:25:40 +0000 (UTC)
Lines: 67
Approved: fjh@cs.mu.oz.au (Fergus Henderson , moderator of comp.std.c++)
Message-ID: <fbtp2vg13aabiknfdlstg23ed932dv0hfu@4ax.com>
References: <pprj2vgjdu35kj1bfi37fcld1p6h5fakbo@4ax.com> <86fzrnl8yj.fsf@Zorthluthik.foo>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
X-Trace: mail2news.demon.co.uk 1043166340 2343 10.0.0.1 (21 Jan 2003 16:25:40 GMT)
X-Complaints-To: abuse@demon.net
NNTP-Posting-Date: Tue, 21 Jan 2003 16:25:40 +0000 (UTC)
X-Received: from mulga.cs.mu.oz.au ([128.250.1.22])
	by news.demon.co.uk with esmtp (Exim 4.05)
	id 18b1DW-0000be-00
	for mail2news@news.news.demon.net; Tue, 21 Jan 2003 16:25:38 +0000
X-Received: by mulga.cs.mu.OZ.AU
	id DAA28290; Wed, 22 Jan 2003 03:25:29 +1100 (EST)
X-Authentication-Warning: mulga.cs.mu.OZ.AU: fjh set sender to devnull@stump.algebra.com using -f
X-Path: comp-std-cpp-robomod!not-for-mail
X-Robomod: STUMP, ichudov@algebra.com (Igor Chudov)
X-Delivered-To: std-c++@ncar.ucar.edu
X-Newsgroups: comp.std.c++
X-Orig-NNTP-Posting-Host: 203-79-126-240.paradise.net.nz (203.79.126.240)
X-Orig-X-Trace: fu-berlin.de 1043134442 27247706 203.79.126.240 (16 [98036])
X-Newsreader: Forte Agent 1.93/32.576 English (American)
X-Spam-Status: No, hits=-6.4 required=5.0
	tests=EMAIL_ATTRIBUTION,QUOTED_EMAIL_TEXT,REFERENCES,
	      SPAM_PHRASE_00_01
	version=2.41
Xref: archiver1.google.com comp.std.c++:17325

On Mon, 20 Jan 2003 23:53:22 +0000 (UTC), llewelly.@@xmission.dot.com
(llewelly) wrote:

>gp1@paradise.net.nz (Graeme Prentice) writes:
>
>> Regarding the expression a @ b where @ is an operator such as << and a
>> has type T1
>> 
>> 13.3.1.2 para 3 bullet 1 says
>> 
>> If T1 is a class type, the set of member candidates is the result of the
>> qualified lookup of T1::operator@ (13.3.1.1.1); otherwise, the set of
>> member candidates is empty.
>> 
>> Does this mean that the class definiiton of T1 has to be visible or does
>> it mean that if the lookup fails for whatever reason, the set of
>> candidates is empty.
>>
>> For example if you write cout << "hello"; does the class definition for
>> the type of cout have to be visible.
>
>3.4.3.1/1 (Qualified name lookup, Class members):
>
># If the nested-name-specifier of a qualified-id nomintates a class,
># the name specified after the nested-name-specifier is looked up in
># the scope of the class (10.2) ... [sniped]
>
>The paragraph then continutes to specify 3 exceptions, applying to
>    destructors, conversion-type-ids, and template-ids, none of which
>    seem relevant to your question.
>
>So combining 13.3.1.2/3 with 3.4.3.1/1, I think the operator will be
>    looked up in the scope of the class, whether it is 'visible' or
>    not.


I'm not sure I understand you.  If the class definition is not visible
then it's an incomplete type so can't be looked up in the scope of the
class.  For the following code, the Borland compiler gives a compile
time error (undefined structure c1),  Comeau 4.3.0.1 gives a
catastrophic failure (seems to be a problem in the Borland backend, so
the "front end" probably thinks it's valid) and GCC 3.2 compiles with no
errors.  If this code is intended to be valid, I think 13.3.1.2 should
say that if the class T1 is an incomplete type then the set of member
candidates is empty  - or else it should say that T1 must be a complete
type.  The way 13.3.1.2  is currently written leaves it open to
interpretation IMO.  Since some compilers treat it as valid code, it's
probably best to allow an incomplete type, to avoid breaking existing
code, if nothing else.

class c1;
extern c1 o1;
void operator<<( c1&, int );

int main()
{
    o1 << 23;
}

Graeme

---
[ comp.std.c++ is moderated.  To submit articles, try just posting with ]
[ your news-reader.  If that fails, use mailto:std-c++@ncar.ucar.edu    ]
[              --- Please see the FAQ before posting. ---               ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html                       ]



