🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #968

Re: Typ eines ?: Ausdruck?

#968
From: Dietmar Kuehl
Date: Wed, 06 Dec 1995 19:54
47 lines
2859 bytes
Hi,
Ullrich von Bassewitz (uz@wuschel.ibb.schwaben.com) wrote:
: Welchen Typ hat das Ergebnis eines ?: Ausdrucks?

Kommt drauf an... :-) Die Section, ueber den '?:' Operator ist relativ
ausfuehrlich.  Auf jeden Fall laeuft es immer wieder darauf hinaus,
dass Typkonversionen angewendet werden, so dass der Typ vom 2. und
vom 3. Operand identisch ist. Fuer Pointer bedeuted dies (September DWP
5.15 [expr.cond] Vers 3):  "... Otherwise, if both the second and the
third expressions are either a pointer or  a  null  pointer  constant,
pointer conversions (_conv.ptr_) are performed to bring them to a
common type, which shall be a cv-qualified or cv-unqualified  version
of the  type of either the second or the third expression. ...".

: Grund fuer meine Frage ist wiederum ein Verhalten der neuen Version von gcc.
: Und zwar wird ploetzlich ein Konstrukt wie

:     Window* W = (A == B)? LastWindow : NULL;

: mit einer Warnung kommentiert:
: "ANSI C++ forbids implicit conversion from `void*' in initialization"

Der Trick liegt daran, dass 'NULL' beim gcc als '(void*)0' definiert
ist. Das ist nach DWP 18.1 (lib.support.types) [Fussnote 135 im April
DWP] nicht zulaessig:  "Possible definitions inlucde 0 and 0L, but not
(void*)0".

: Was g++ da macht ist so ungefaehr klar: Der ?: Ausdruck wird ausgewertet,
: das Ergebnis ist aber kein Window* (so wie frueher und bei allen anderen
: Compilern die ich kenne), sondern es wird "void*" als kleinster gemeinsamer
: Nenner gewaehlt, woraufhin die Zuweisung fehlschlaegt.

: Ist das tatsaechlich nach dem neuen Standard richtig?

Die Konversion, die der gcc in diesem Fall macht ja, die Definition von
'NULL' nicht. Der Fehler wird am Einfachst dadurch behoben, dass man
anstelle von 'NULL' einfach '0' verwendet. Am Anfang musste ich mich
auch daran gewoehnen (ich habe lange C programmiert, bevor ich auf C++
umgestiegen bin), aber inzwischen finde ich 'NULL' ziemlich haesslich.
BTW, gcc ist nicht der einzige Compiler (vielmehr libg++ nicht die
einzige Library), der das Problem hat. Das gibt es mit anderen
Compilern auch. Daher loesst die '0' das Problem in portabler weise;
man gewinnt, IMHO, durch 'NULL' nichts.
--
dietmar.kuehl@uni-konstanz.de
http://www.informatik.uni-konstanz.de/~kuehl
I am a realistic optimist - that's why I appear to be slightly pessimistic
Technical Details
Message-ID: <30c5f4ed.0@minerva.rz.uni-konstanz.de>
Path: arc1-ca.pugleaf.net!minerva.rz.uni-konstanz.de!uzwil!kuehl
References: <RCD7B0RH@wuschel.ibb.schwaben.com>

Show Full Headers
Complete Article Headers
From: kuehl@uzwil.informatik.uni-konstanz.de (Dietmar Kuehl)
Subject: Re: Typ eines ?: Ausdruck?
Newsgroups: de.comp.lang.c++
References: <RCD7B0RH@wuschel.ibb.schwaben.com>
Organization: Fakultät für Mathematik und Informatik
Reply-To: dietmar.kuehl@uni-konstanz.de
X-Newsreader: TIN [version 1.2 PL2]
NNTP-Posting-Host: minerva.rz.uni-konstanz.de
Message-ID: <30c5f4ed.0@minerva.rz.uni-konstanz.de>
Date: 6 Dec 95 19:54:21 GMT
Path: arc1-ca.pugleaf.net!minerva.rz.uni-konstanz.de!uzwil!kuehl