C++11 将向量传递给构造函数

C++11 pass vector to constructor

本文关键字:构造函数 向量 C++11      更新时间:2023-10-16

我整天都在阅读关于传递论点的最有效方法,我很困惑。我想传递这样的向量:

Foo f({1,2,3});

我只是想用传递的向量初始化我的_member变量。现在的问题是我的构造函数应该是什么样子:

// pass by value
Foo (vector<int> vec) : _member{vec} {}
// const reference
Foo (const vector<int>& vec) : _member{vec} {}
// rvalue reference
Foo (vector<int>&& vec) : _member{std::move(vec)} {}

最简单的方法是按值获取向量,然后移动它:

Foo (vector<int> vec) : _member{std::move(vec)} {}

与一对 const vector<int>&/vector<int>&& 重载相比,您最多需要支付一次额外的移动(这对于向量来说非常便宜),但不必编写两个构造函数(如果您有多个参数,这可能会很快爆炸)。

按值传递是当今许多圈子的流行趋势。出于各种原因,我认为这对构造函数来说是一个不错的选择,所以我同意 T.C. 的答案。但是,传递参数(到非构造函数)的最佳方式的更广泛问题,我很少建议按值传递。我真的,非常强烈建议听听赫伯·萨特(Herb Sutter)关于这个话题的演讲的这一部分:https://youtu.be/xnqTKD8uD64?t=51m34s。

总而言之,在

构造函数之外:与通过 const-ref 的简单传递相比,按值传递提供了更差的最坏情况性能保证,在所有情况下它提供的性能都比 const-ref/rvalue-ref 重载差,它使提供异常保证变得更加困难,它切片多态类型,当复制是有条件的时不能使用它。

在大多数情况下,你

要么不在乎合理的表现,要么你非常关心。在第一种情况下,使用 const-ref 越来越容易。在第二种情况下,按值传递不够好。同样,请记住,构造函数由于几个不同的原因而不同(它们是移动构造事物而不是移动分配,它们接受许多参数,这些参数会强烈影响您需要的重载数量)。

不幸的是,这个问题没有这么简单的答案。最终这两种方法都足够好,但我认为要掌握C++,你想知道两者的优缺点。

在这种特殊情况下,您正在传递rvalue因此第三种选择是最好的。