In the following code, the variadic constructor is called twice. How can I get the copy constructor to be called instead of the single argument version of the variadic constructor when appropriate?
#include <iostream>
struct Foo
{
Foo(const Foo &)
{
std::cout << "copy constructor\n";
}
template<typename... Args>
Foo(Args&&... args)
{
std::cout << "variadic constructor\n";
}
std::string message;
};
int main()
{
Foo f1;
Foo f2(f1); // this calls the variadic constructor, but I want the copy constructor.
}
This actually has nothing to do with the fact that the constructor is variadic. The following class with a non-variadic constructor template exhibits the same behavior:
The problem is that the constructor template is a better match. To call the copy constructor, a qualification conversion is required to bind the non-const lvalue
f1toconst Foo&(the const qualification must be added).To call the constructor template, no conversions are required:
Tcan be deduced toFoo&, which after reference collapsing (Foo& &&->Foo&), gives the parameterxtypeFoo&.You can work around this by providing a second copy constructor that has a non-const lvalue reference parameter
Foo&.