explicit constructor und initialisierung

07/05/2015 - 16:00 von Heinz Saathoff | Report spam
Moin,

ich habe folgendes bei einem explicit constructor festgestellt, hier
am Beispiel mit auto_ptr:

std::auto_ptr<int> ap1(new int); // ok
std::auto_ptr<int> ap2 = new int; // Fehler

Warum ist der 2. Fall als Initialisierung nicht erlaubt? Ich dachte
bisher, dass bei der Initialisierung die Zuweisung gar keine
Zuweisung, sondern eine Initialisierung mit Konstruktor ist. Mit
explicit scheint da aber ein Unterschied zu sein.
Eigentlich will man mittels explicit doch nur vermeiden, dass still
und heimlich Konversionen durchgeführt werden.


- Heinz
 

Lesen sie die antworten

#1 ram
08/05/2015 - 00:38 | Warnen spam
Heinz Saathoff writes:
std::auto_ptr<int> ap1(new int);// ok
std::auto_ptr<int> ap2 = new int;// Fehler



Es gibt »auto_ptr« nur in historischen C++-Versionen, wie
beispielsweise in dem bereits vor vielen Wochen abgelöstem
ISO/IEC 14882:2011 (siehe: C.4.2, [diff.cpp14.depr]).

»std« bedeutet soviel wie »der nàchste erreichbare
Namensraum std«. Ich nehme an, daß Du den globalen
Namensraum »::std« meinst.

Falls man in irgendwelchen Archiven noch Exemplare der alten
Normen von 2011 ausgraben kann, so findet man den Konstruktor

explicit auto_ptr( X * p = 0 )throw();

, der ohne weiteres eine Direktkonstruktion mit X* erlaubt.

Mit

= new int;

wird eine Kopierinitialisierung verlangt, die ein Exemplar
der Zielklasse als Quelle verlangt. Daher muß hier nun »new int«
erst einmal implizit in ein »::std::auto_ptr< int >«
gewandelt werden, was aber durch das »explicit« verboten wird.

Ähnliche fragen