Article View: de.comp.lang.c++
Article #968Re: Typ eines ?: Ausdruck?
From: Dietmar Kuehl
Date: Wed, 06 Dec 1995 19:54
Date: Wed, 06 Dec 1995 19:54
47 lines
2859 bytes
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!kuehlReferences:
<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