【发布时间】:2014-10-21 14:13:24
【问题描述】:
我想知道以下是否是C++中完美转发的正确使用(解释如下):
class A
{
public:
//...
template <typename T> A( T&& b,const C& c ) : _b{ std::forward<T>( b ) },_c{ c } { }
//...
private:
B _b;
C _c;
};
A 类型的对象包含一个B 和一个C 对象。要求 A 对象可以单独从一对 (B b,C c) 构造。现在上下文表明,对于这样的构造,c 必须复制到_c 中。因此,c 作为const C& 传递。另一方面,根据具体情况,必须将b 复制到_b,或者可以将b 移动到_b。上面的代码是否能正确完成这一点,即它是否会根据代码中A 类型的对象的构造方式生成适当的构造函数?即,这是对完美转发的正确使用吗?
我认为它做了正确的事情,但我生气的原因是:我认为这有点难看,因为我只想在第一个参数中使用B 类型的左值或右值调用构造函数。上面的代码 - 原则上 - 允许任何类型T。是定义这两种方法的替代方案
A( B& b,const C& c ) : _b{ b },_c{ c } { }
A( B&& b,const C& c ) : _b{ std::move( b ) },_c{ c } { }
是首选?
【问题讨论】:
-
是的,没错。如果你不喜欢它,定义两个构造函数。