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%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.
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:
Tags und Links c++ c++11 templates variadic-templates