c++ - 我什么时候应该使用前进和移动?

标签 c++ c++11

我有一个对 vector 进行操作的代码:

template<typename T>
void doVector(vector<T>& v, T&& value) {
    //....
    v.push_back(value);
    //...
}

对于普通的push_back,我需要使用forward(value)move(value)还是只需要value(根据新的 C++11)?它们对性能有何影响?

例如,

v.push_back(forward<T>(value));

最佳答案

当第二个参数为左值时,当前代码将无法编译,因为T&&结果是X&这意味着 T需要X&这又意味着 std::vector<T>将变为 std::vector<X&>这将不匹配第一个参数 std::vector<X> & .因此,这是一个错误。

我会使用两个模板参数:

template<typename T, typename V>
void doVector(vector<T> & v, V && value) 
{
    v.emplace_back(std::forward<V>(value));
}

自从 V可以是与 T 不同的类型吗? , 所以 emplace_back使更多有意义,因为它不仅解决了问题,而且使代码更通用。 :-)

现在进行下一个改进:因为我们使用的是 emplace_back它创建了 T 类型的对象来自参数 value (可能使用构造函数),我们可以利用这一事实,并使其成为可变函数:

template<typename T, typename ...V>
void doVector(vector<T> & v, V && ... value) 
{
    v.emplace_back(std::forward<V>(value)...);
}

这更通用,因为您可以将其用作:

struct point
{
    point(int, int) {}
};

std::vector<point> pts;
doVector(pts, 1, 2);

std::vector<int> ints;
doVector(ints, 10);

希望对您有所帮助。

关于c++ - 我什么时候应该使用前进和移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18214434/

相关文章:

c++ - 读取命名管道不会刷新它

c++ - boost::bind 为具有默认值的成员函数?

c++ - 自动初始化和 const 正确性

c++ - 在同一个 C++ 源文件中使用多个命名空间是一种好习惯吗?

c++ - 在 key 之外的其他东西上订购容器

c++ - (如何)我可以在 Centos/RHEL 上使用新的 C++ 11 ABI 和 devtoolset-7 吗?

c++ - 复制和修改 std::strings 时无法解释的差异

c++ - 非静态数据成员初始化器问题

c++ - 缓存行对齐(需要在文章中说明)

c++ - SQLite Blob 插入 C++