Ben*_*ley 11 c++ templates variadic-templates c++11
在以下代码中,可变参数构造函数被调用两次.在适当的时候,如何才能调用复制构造函数而不是可变参数构造函数的单个参数?
#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.
}
Run Code Online (Sandbox Code Playgroud)
Jam*_*lis 12
这实际上与构造函数是可变参数的事实无关.具有非可变构造函数模板的以下类表现出相同的行为:
struct Foo
{
Foo() { }
Foo(const Foo& x)
{
std::cout << "copy constructor\n";
}
template <typename T>
Foo(T&& x)
{
std::cout << "template constructor\n";
}
};
Run Code Online (Sandbox Code Playgroud)
问题是构造函数模板是更好的匹配.要调用复制构造函数,需要进行限定转换以将非const左值绑定f1到const Foo&(必须添加const限定条件).
要调用构造函数模板,不需要转换: T可以推导出Foo&,在引用折叠(Foo& &&- > Foo&)之后,给出参数x类型Foo&.
您可以通过提供具有非const左值引用参数的第二个复制构造函数来解决此问题Foo&.
const Foo&除了传统的复制构造函数之外,只需提供精确匹配的重载,即带有非重载的重载.然后,您可以通过显式转换委托调用:
Foo(Foo& other) : Foo{const_cast<Foo const&>(other)} { }
Run Code Online (Sandbox Code Playgroud)