gpt4 book ai didi

c++ - 如何通过转发模板从 const 引用或临时对象构造对象

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

考虑这个最小的例子

template <class T>
class Foo
{
public:
Foo(const T& t_)
: t(t_)
{
}

Foo(T&& t_)
: t(std::move(t_))
{
}

T t;
};

template <typename F>
Foo<F> makeFoo(F&& f)
{
return Foo<F>(std::forward<F>(f));
}

int main()
{
class C
{

};

C c;

makeFoo(c);
}

MSVC 2017 失败并出现 Foo 构造函数的重新定义错误。显然 T 被推断为 C& 而不是预期的 C。这究竟是如何发生的以及如何修改代码以使其执行预期的操作:从 const 引用复制构造 Foo::t 或从 r- 移动构造它值(value)。

最佳答案

C++17 中,您可以简单地编写:

template <typename F>
auto makeFoo(F&& f)
{
return Foo(std::forward<F>(f));
}

因为 class template argument deduction .


C++14 中你可以这样写:

template <typename F>
auto makeFoo(F&& f)
{
return Foo<std::decay_t<F>>(std::forward<F>(f));
}

关于c++ - 如何通过转发模板从 const 引用或临时对象构造对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57312384/

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