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