gpt4 book ai didi

c++ - 如何通过可变构造函数调用复制构造函数?

转载 作者:可可西里 更新时间:2023-11-01 15:04:32 26 4
gpt4 key购买 nike

在下面的代码中,可变参数构造函数被调用了两次。如何在适当的时候调用复制构造函数而不是可变参数构造函数的单参数版本?

#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.
}

最佳答案

这实际上与构造函数是可变的这一事实无关。以下具有非可变构造函数模板的类表现出相同的行为:

struct Foo
{
Foo() { }

Foo(const Foo& x)
{
std::cout << "copy constructor\n";
}

template <typename T>
Foo(T&& x)
{
std::cout << "template constructor\n";
}

};

问题是构造函数模板更匹配。要调用复制构造函数,需要进行限定转换以将非常量左值 f1 绑定(bind)到 const Foo&(必须添加 const 限定)。

要调用构造函数模板,不需要任何转换:T 可以推导为 Foo&,在引用折叠后 (Foo& && -> Foo&), 给出参数 x 类型 Foo&

您可以通过提供具有非常量左值引用参数 Foo& 的第二个复制构造函数来解决此问题。

关于c++ - 如何通过可变构造函数调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11037644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com