[gelöst] cTor und operator= bei static function?
-
Hallo,
ich war lange lange weg vom C++ und fange jetzt wieder an. Natürlich fange ich wieder klein an und habe folgendes Verständnis Problem:alfColorBit a(alfColorBit::getBlue()); alfColorBit b(alfColorBit(alfColorBit::getBlue())); // C2751 auto c = alfColorBit(alfColorBit::getBlue()); auto d = alfColorBit(alfColorBit(alfColorBit::getBlue()));
Man erkennt an der Fehlermeldung, ich arbeite mit Visual Studio, derzeit in der Version 2015, was wohl keinen Unterschied macht.
Meine Klasse "alfColorBit" hat folgende cTor und operator=
alfColorBit() : a_value(0) {} alfColorBit(const alfColorBit& copy) : a_value(copy.a_value) {} alfColorBit(alfColorBit&& move) : a_value(std::move(move.a_value)) {} alfColorBit(const value_type& copy) : a_value(copy) {} alfColorBit(value_type&& move) : a_value(std::move(move)) {} void operator=(const alfColorBit& copy) { set(copy); } void operator=(alfColorBit&& move) { set(std::move(move)); } void operator=(const value_type& copy) { set(copy); } void operator=(value_type&& move) { set(move); }
Die Funktion getBlue() wird aus einem Makro zusammen gebaut, schaut im Ergebnis aber so aus:
static value_type getBlue() noexcept { return static_cast<value_type>(1 << 3); }
So, und jetzt mein Problem:
In meinem Code sollten alle 4 Zeilen das gleiche Ergebnis liefern. Im Endeffekt müsste ja der move-cTor das meiste abfeiern (das wollte ich mit dem Code eigentlich auch testen).
Aber Zeile 2 und Zeile 4 werden unterschiedlich gewertet. In Zeile 2 erhalte ich...error C2751: "alfColorBit::getBlue": Der Name eines Funktionsparameters kann nicht qualifiziert sein
...was ich jetzt nicht verstehe, warum dort das "alfColorBit::getBlue()" nicht erlaubt ist, wobei es in Zeile 4 durchaus erlaubt ist. Beide Male müsste doch der Wert in den "inneren" cTor(const alfColorBit& copy) übergeben werden, und danach in den "äußeren" cTor(alfColorBit&& move) wandern, oder?
Wo ist mein Denkfehler?
Danke,
Stefan
-
alfColorBit b(alfColorBit(alfColorBit::getBlue())); // C2751
sieht wie die Deklaration einer Funktion b aus - ohne redundante Klammern wird es deutlicher:
alfColorBit b(alfColorBit alfColorBit::getBlue());
https://en.wikipedia.org/wiki/Most_vexing_parse
alfColorBit b((alfColorBit(alfColorBit::getBlue())));
wäre möglich.
-
Ah jetzt ja, verstanden. Da wäre ich jetzt im Leben nicht drauf gekommen.
Klappt super, Beitrag in die Lesezeichen aufgenommenDanke schön.