move construction with default ctor object
-
Guten Morgen,
folgendes
class Foo { public: Foo(){} //default Foo(int x){} //val } class Bar { public: Bar(Foo&& foo): _foo(std::move(foo)) {} Foo_foo; };
Wenn ich nun Bar mit Foo erstellen möchte, geht
Bar b(Foo());
nicht, wobei
Bar b(Foo(42));
geht.
erkomm damit klar wenn ich "keinen" standart Ctor verwendet.
habe auch mal den
operator()()=delete:
falls der ctr hier in konflikt steht.. geht aber nicht
was mache ich falsch?
danke ezch
-
@SoIntMan sagte in move construction with default ctor object:
was mache ich falsch?
Warnungen anmachen
<source>:21:10: warning: parentheses were disambiguated as a function declaration [-Wvexing-parse] 21 | Bar b(Foo()); | ^~~~~~~ <source>:21:10: note: replace parentheses with braces to declare a variable 21 | Bar b(Foo()); | ^~~~~~~ | - | { - | }
Für genaueres Verständniss, der Suchbegriff ist: "The Most Vexing Parse" (Damit findet man z.B. den Link: https://www.fluentcpp.com/2018/01/30/most-vexing-parse/)
Und:
Bar b{Foo()};
funktioniert.
Edit: Die Warnung habe ich mit der neusten GCC Version und dem Compiler Explorer erstellt. Ich denke, dass andere Compiler auch warnen werden.
-
@Schlangenmensch sagte in move construction with default ctor object:
Für genaueres Verständniss, der Suchbegriff ist: "The Most Vexing Parse"
aha.. habe gegoogelt und gegoogelt aber diese Begriff hab ich ne gefunden oder in verbindung gesetzt;)
Danke Dir
-
@Schlangenmensch sagte in move construction with default ctor object:
Die Warnung habe ich mit der neusten GCC Version und dem Compiler Explorer erstellt. Ich denke, dass andere Compiler auch warnen werden.
ja ne warnung kommt in msvc nicht
-
@SoIntMan Hm, ich bekomme auc mit MSVC eine Warnung:
warning C4930: 'Bar b(Foo (__cdecl *)(void))': prototyped function not called (was a variable definition intended?)
Ist nicht so schön, wie die vom GCC, aber es wird zumindest angemeckert.