zer*_*ght 1 c++ constructor arguments
我有一个像这样的第一个构造函数
X::X(const std::vector<int>& v1, const std::vector<int>& v2, const std::vector<int>& v3) : _v1(v1), _v2(v2), _v3(v3){
} // _v1 , _v2 and _v3 are members
Run Code Online (Sandbox Code Playgroud)
对于这种行为,我还应该实现移动构造函数版本
X::X(std::vector<int>&&, std::vector<int>&&, std::vector<int>&&);
Run Code Online (Sandbox Code Playgroud)
但是可以像这样使用const左值引用和右值引用的混合类型的参数
X::X(const std::vector<int>&, std::vector<int>&&, const std::vector<int>&);
Run Code Online (Sandbox Code Playgroud)
是实现所有可能的构造函数的最佳实践,即2 ^ 3?
因为它是我们在这里讨论的构造函数,所以只需按值获取参数并移动它们是合理有效的:
X::X(std::vector<int> v1, std::vector<int> v2, std::vector<int> v3)
: _v1(std::move(v1)), _v2(std::move(v2)), _v3(std::move(v3)) {}
Run Code Online (Sandbox Code Playgroud)
每个向量最多花费一个额外的移动,具体取决于实际参数.但是移动很便宜,而且你不必编写8个单独的构造函数或一些不可读的SFINAE混乱.
请注意,如果您要执行任务,则注意事项会有很大差异.复制构造+移动分配的效率可能远低于简单的复制分配,因为后者可能能够重用分配给对象所拥有的资源.当您构建一个新对象时,这个因素不起作用,因为没有资源可以重用.
归档时间: |
|
查看次数: |
498 次 |
最近记录: |