Wie bekomme ich den Aufruf des Copy-Konstruktors über einen Variadic-Konstruktor?

8

Im folgenden Code wird der Variadic-Konstruktor zweimal aufgerufen. Wie kann ich den Kopierkonstruktor anstelle der Einzelargumentversion des Variadic-Konstruktors aufrufen, wenn dies angebracht ist?

%Vor%     
Benjamin Lindley 14.06.2012, 16:42
quelle

2 Antworten

9

Das hat eigentlich nichts damit zu tun, dass der Konstruktor variadisch ist. Die folgende Klasse mit einer nicht variadischen Konstruktormaske weist dasselbe Verhalten auf:

%Vor%

Das Problem ist, dass die Konstruktorvorlage besser passt. Um den Kopierkonstruktor aufzurufen, ist eine Qualifizierungskonvertierung erforderlich, um den nichtkonstanten Lvalue f1 an const Foo& zu binden (die const-Qualifizierung muss hinzugefügt werden).

Um die Konstruktorvorlage aufzurufen, sind keine Conversions erforderlich: T kann zu Foo& abgeleitet werden, was nach dem kollabierenden Verweis ( Foo& && - & gt; Foo& ) den Parameter x type% co_de ergibt %.

Sie können dies umgehen, indem Sie einen zweiten Kopierkonstruktor mit einem nichtkonstanten lvalue-Referenzparameter Foo& bereitstellen.

    
James McNellis 14.06.2012, 16:48
quelle
4

Stellen Sie einfach eine exact-match-Überladung, d. h. eine mit einem const Foo& , zusätzlich zu dem herkömmlichen Kopierkonstruktor bereit. Dann können Sie den Aufruf über einen expliziten Cast delegieren:

%Vor%     
Konrad Rudolph 14.06.2012 16:46
quelle