gpt4 book ai didi

c++ - 非模板类方法的完美转发

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:43:24 25 4
gpt4 key购买 nike

完美转发通常出现在模板类的上下文中。对于非模板类,是否值得制作例如构造函数是一个模板方法,因此它可以使用完美转发?类似下面的内容:

class Foo()
{
public:
template<typename T>
Foo(T &&vec) : memberVec(std::forward<T>(vec)) {};

private:
std::vector memberVec;
};

优点基本相同,但是当我们知道真正的类类型时,有什么不同吗?这什么时候是好的做法,什么时候不是?

最佳答案

非显式单参数构造函数是转换构造函数。除非Foo应该是可转换的 vector (这可能是真的),你应该把它变成explicit .

一般来说,对于单参数 ctors,您需要禁用 SFINAE Foo匹配的类型。隐式 Foo&&Foo const&当你调用 Foo 时,ctors 是更糟糕的匹配用Foo& (比如,一个非常量左值)比你的模板构造函数。一个简单的class=std::enable_if_t<!std::is_same<std::decay_t<T>,Foo>>足够了。

将生成更多代码。

在这种情况下,std::vector<X>搬家便宜得离谱,所以

Foo( std::vector<X> vec ):memberVec(std::move(vec)) {}

99% 的效率和清晰度。

当您使用它时,通常会出现完美转发失败。上面的例子没有它们——我可以 Foo x({1,2,3})它通过了 {1,2,3}构建 vec .与 T&&它不会,因为它无法推断出什么 T是。

关于c++ - 非模板类方法的完美转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36363698/

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