abi*_*bir 12 c++ constructor assignment-operator perfect-forwarding c++11
我对c ++隐式复制构造函数的理解类似于
T(T const& x) :
base1(x), base2(x) ... ,
var1(x.var1), var2(x.var2)...
{}
Run Code Online (Sandbox Code Playgroud)
移动构造函数,复制和移动赋值也遵循类似的模式.
为什么没有定义类似于以下内容?
T(T const& x) :
base1(static_cast<base1 const&>(x)),
base2(static_cast<base2 const&>(x)) ... ,
var1(x.var1), var2(x.var2)...
{}
Run Code Online (Sandbox Code Playgroud)
例
我有一个类具有隐式复制/移动构造函数/赋值运算符,以及一些转换构造函数.我把工作委托给了一些实现类.
class common_work //common implementation of many work like classes
{
common_work(common_work const&) = default;
common_work(common_work&&) = default;// ... implicit constructors work for me.
//a forwarding constructor which can take many work like objects
template<class T, enable_if<work_like<T> > >
common_work(T&& x) { ... }
};
class work1 //one of the implementation
{
work1(work1 const& ) = default;
work1(work1&& ) = default; ...
common_work impl_;
};
Run Code Online (Sandbox Code Playgroud)
这很好,因为work1复制/移动构造函数正在调用复制/移动构造函数common_work,并且转发构造函数被其他构造函数[未在代码中显示]使用,后者从另一种构造函数转换work.
后来我想继承work1从common_work对EBO等原因.所以work1新课看起来像
class work1 : private common_work
{
work1(work1 const& ) = default;
work1(work1&& ) = default; ...
};
Run Code Online (Sandbox Code Playgroud)
但是,因为work1是一个work_like类,突然转发构造函数得到了更好的匹配,因为复制/移动构造函数common_work需要static_cast从派生到基础.
注意 :
common_work作为CRTP,即作为模板参数传递的派生类类型,并在转发构造函数中将其过滤为enable_if<and_<work_like<T>,not_<is_same<T,Derived> > > >.否则,我必须手动写复制/移动构造函数/分配work1和static_cast基地类中明确,这是越野车,容易出错,和维护风险.几年前,这个问题在 MSVC++ bugstracker 页面上讨论过(所以如果它尚未修复,那么它是 MSVC++ 上的一个已知问题)。标准说
- ...基数或成员直接用 x 的相应基数或成员进行初始化。
当我阅读错误报告时,我确实测试了各种编译器,并且所有这些编译器都是“神奇铸造的”。该标准似乎对细节(也关于值类别和 c/v 限定符)保持沉默,只是说“具有 x 的相应基数”,如果您将其理解为意思,那么 IMO 就更有意义了“不是x,而是x的相应基数......”而不是你将完整的对象传递给它(我什至会说它只能这样才有意义)。
| 归档时间: |
|
| 查看次数: |
502 次 |
| 最近记录: |