Das explicit-Dilemma
-
Sone schrieb:
Wer nun behauptet, dass man einen vector-Funktionsparameter so initialisieren dürfen sollte, hat sie m.M.n. nicht mehr alle. Das ist eigentlich das Hauptproblem dabei.
Deine Meinung ist kein Problem für mich. Ich sehe auch kein anderes.
-
camper schrieb:
Deine Meinung ist kein Problem für mich.
Niemandes Meinung kann ein Problem sein. Meinung ist Meinung und nicht Fakt.
Gut Begründete Meinungen hingegen können einen zum Nachdenken bringen. Leider ist meine nicht sehr gut begründet...
Ich sehe auch kein anderes.
Gut, mal sehen was die anderen sagen. Wahrscheinlich dasselbe. Aber ich wollte einfach mal sehen, ob ich damit der einzige bin oder nicht.
-
Dann markieren wir zwei von drei Konstruktoren explizit... Redundanz pur
Nach längerem Nachdenken erscheint das Argument kraftlos.
Gut, das ist tatsächlich eine dumme Sache. Habe nicht genug darüber Nachgedacht.
-
Sone schrieb:
Wer nun behauptet, dass man einen vector-Funktionsparameter so initialisieren dürfen sollte, hat sie m.M.n. nicht mehr alle.
Noe, du hast sie nicht mehr alle. {} ist ganz klar eine Objektkonstruktion.
Die folgenden beiden Beispiele sollten funktionieren:std::unique_ptr<Foo> makeFoo() { return { new Foo }; }
void foo(std::tuple<int, double, std::string> t); foo({ 42, 3.14, "blubb" });
Ich glaube, viel expliziter geht es gar nicht mehr.
-
std::unique_ptr<Foo> makeFoo() { return { new Foo }; }
Das kompiliert erstens nicht.. zweitens reden wir (ich) von Konstruktoren mit mehreren Parametern. Hast du meinen Post gelesen?
foo({ 42, 3.14, "blubb" });
So, und jetzt ohne Funktionsdeklaration. Wie explizit ist es jetzt?
-
Danke, dass du mich bestaetigst.
-
Für mich ändert sich nichts, ich markiere von jeher alle Konstruktoren als
explicit
, ausgenommen welche die implizit konvertieren können sollen.
Unabhängig davon wie viele Parameter ohne Default-Wert sie haben.
-
Was ändert sich genau mit C++11 im Bezug auf
explicit
?Mir fehlt gerade das Hintergrundwissen -- verhindert das
explicit
-Schlüsselwort eine Konstruktion mittels{}
-Syntax?
-
Nexus schrieb:
Was ändert sich genau mit C++11 im Bezug auf
explicit
?Lies meinen OP.
Mir fehlt gerade das Hintergrundwissen -- verhindert das
explicit
-Schlüsselwort eine Konstruktion mittels{}
-Syntax?Ja, ganz genau.
Aber nicht direct-list-initialization, das ist ja explizit. Sondern copy-list-initialization.Aber im OP habe ich das doch erklärt.
hustbaer schrieb:
Für mich ändert sich nichts, ich markiere von jeher alle Konstruktoren als
explicit
, ausgenommen welche die implizit konvertieren können sollen.
Unabhängig davon wie viele Parameter ohne Default-Wert sie haben.Ja, das ist die Idee.
-
Kellerautomat schrieb:
void foo(std::tuple<int, double, std::string> t); foo({ 42, 3.14, "blubb" });
Ich glaube, viel expliziter geht es gar nicht mehr.
Es ist gar nicht explizit, da an der Stelle wo konstruiert wird der Typ nicht erwähnt wird. Ohne die Signatur der Funktion zu kennen kann man unmöglich sagen was hier konstruiert wird - könnte alles sein was mit diesen Ctor-Arguments klarkommt.
Explizit wäre
void foo(std::tuple<int, double, std::string> t); foo(std::tuple<int, double, std::string>{ 42, 3.14, "blubb" });