Topic: const' binding to specifier in declaration list
Author: kanze@lts.sel.alcatel.de (James Kanze US/ESC 60/3/141 #40763)
Date: 1996/04/17 Raw View
In article <3173B383.41C67EA6@rstcorp.com> "Aaron S. Binns"
<asbinn@rstcorp.com> writes:
|> [Moderator's note: This is crossposted to comp.std.c++ and
|> comp.lang.c++, and followups have been set to comp.std.c++. mha]
|> I recently came across a piece of code that reads:
|> class A {
|> // contents of class A
|> } a1, *a2, const *a3;
While I personally wouldn't write anything like this, it is definitly
legal.
|> This looks pretty bogus to me. I thought that the 'const' applied
|> to the elaborated specifier 'class A'. If the 'const' qualifier is
|> supposed to apply to the pointer in 'a3', then it should come _after_
|> the '*'.
No, it is the A being pointed to that is const, not the pointer.
Separating each of the definitions out into a separate statement makes
this obvious:
class A { ... } ;
A a1 ;
A* a2 ;
A const* a3 ;
|> I think that either one of the two following was intended.
|> 1)
|> class A {
|> // contents of class A
|> } a1, *a2, * const a3;
|> 2)
|> class A {
|> // contents of class A
|> } a1, *a2;
|> A const *a3; // Or const A *a3;
Regardless of what was intended, 2 is the interpretation required by
the draft standard (and by the C standard).
--
James Kanze Tel.: (+33) 88 14 49 00 email: kanze@gabi-soft.fr
GABI Software, Sarl., 8 rue des Francs-Bourgeois, F-67000 Strasbourg, France
Conseils, itudes et rialisations en logiciel orienti objet --
-- A la recherche d'une activiti dans une region francophone
---
[ comp.std.c++ is moderated. To submit articles: Try just posting with your
newsreader. If that fails, use mailto:std-c++@ncar.ucar.edu
comp.std.c++ FAQ: http://reality.sgi.com/austern/std-c++/faq.html
Moderation policy: http://reality.sgi.com/austern/std-c++/policy.html
Comments? mailto:std-c++-request@ncar.ucar.edu
]
Author: jsa@edg.com (J. Stephen Adamczyk)
Date: 1996/04/17 Raw View
In article <KANZE.96Apr17121453@slsvgqt.lts.sel.alcatel.de> kanze@lts.sel.alcatel.de (James Kanze US/ESC 60/3/141 #40763) writes:
>In article <3173B383.41C67EA6@rstcorp.com> "Aaron S. Binns"
><asbinn@rstcorp.com> writes:
>|> I recently came across a piece of code that reads:
>
>|> class A {
>|> // contents of class A
>|> } a1, *a2, const *a3;
>
>While I personally wouldn't write anything like this, it is definitly
>legal.
No, I'm sorry, that's not true. This little syntactic oddity is something
accepted by the Microsoft compiler, but it's not standard C or C++.
The part that gets repeated in a declaration comma list is the declarator,
and the cv-qualifiers can only appear following a pointer or pointer-to-member
declarator in the declarator syntax.
A little research with the Microsoft compiler suggests that:
int i, const j, const *k; // Declares j as "const int", k as "int *"
So the "const" above does nothing. But that is outside the scope of
comp.std.c++.
Steve Adamczyk
Edison Design Group
---
[ comp.std.c++ is moderated. To submit articles: Try just posting with your
newsreader. If that fails, use mailto:std-c++@ncar.ucar.edu
comp.std.c++ FAQ: http://reality.sgi.com/austern/std-c++/faq.html
Moderation policy: http://reality.sgi.com/austern/std-c++/policy.html
Comments? mailto:std-c++-request@ncar.ucar.edu
]
Author: kanze@gabi-soft.fr (J. Kanze)
Date: 1996/04/18 Raw View
In article <KANZE.96Apr17121453@slsvgqt.lts.sel.alcatel.de>
kanze@lts.sel.alcatel.de (James Kanze US/ESC 60/3/141 #40763) writes:
|> In article <3173B383.41C67EA6@rstcorp.com> "Aaron S. Binns"
|> <asbinn@rstcorp.com> writes:
|> |> [Moderator's note: This is crossposted to comp.std.c++ and
|> |> comp.lang.c++, and followups have been set to comp.std.c++. mha]
|> |> I recently came across a piece of code that reads:
|> |> class A {
|> |> // contents of class A
|> |> } a1, *a2, const *a3;
|> While I personally wouldn't write anything like this, it is definitly
|> legal.
Actually, on further thought, I don't think it is legal. In the statement:
A const* a3 ;
The const is part of the `declaration-specifiers', and not the
`declarator'. When multiple symbols are declared in the same line, as
here, the list contains declarators, and cannot contain additional parts
of the declaration-specifiers.
A quick check of the grammar shows that the first token of a declarator
must be one of { `*', `(' , <identifier> }. The keyword `const' is none
of these.
--
James Kanze (+33) 88 14 49 00 email: kanze@gabi-soft.fr
GABI Software, Sarl., 8 rue des Francs Bourgeois, 67000 Strasbourg, France
Conseils en informatique industrielle --
-- Beratung in industrieller Datenverarbeitung
---
[ comp.std.c++ is moderated. To submit articles: Try just posting with your
newsreader. If that fails, use mailto:std-c++@ncar.ucar.edu
comp.std.c++ FAQ: http://reality.sgi.com/austern/std-c++/faq.html
Moderation policy: http://reality.sgi.com/austern/std-c++/policy.html
Comments? mailto:std-c++-request@ncar.ucar.edu
]
Author: "Aaron S. Binns" <asbinn@rstcorp.com>
Date: 1996/04/16 Raw View
[Moderator's note: This is crossposted to comp.std.c++ and
comp.lang.c++, and followups have been set to comp.std.c++. mha]
I recently came across a piece of code that reads:
class A {
// contents of class A
} a1, *a2, const *a3;
This looks pretty bogus to me. I thought that the 'const' applied
to the elaborated specifier 'class A'. If the 'const' qualifier is
supposed to apply to the pointer in 'a3', then it should come _after_
the '*'.
I think that either one of the two following was intended.
1)
class A {
// contents of class A
} a1, *a2, * const a3;
2)
class A {
// contents of class A
} a1, *a2;
A const *a3; // Or const A *a3;
Is my interpretation of the binding of 'const' more or less correct?
BTW, this code _is_ accepted by the Microsoft VC/C++ v2.0 compiler.
--
Aaron S. Binns Reliable Software Technologies Corp.
21515 Ridgetop Circle, Suite 250
asbinn@rstcorp.com Sterling, VA 20166
http://www.rstcorp.com
---
[ comp.std.c++ is moderated. To submit articles: Try just posting with your
newsreader. If that fails, use mailto:std-c++@ncar.ucar.edu
comp.std.c++ FAQ: http://reality.sgi.com/austern/std-c++/faq.html
Moderation policy: http://reality.sgi.com/austern/std-c++/policy.html
Comments? mailto:std-c++-request@ncar.ucar.edu
]