gpt4 book ai didi

c++ - 从参数初始化数据成员的 C++11 方法

转载 作者:IT老高 更新时间:2023-10-28 21:53:12 28 4
gpt4 key购买 nike

鉴于 C++11 支持移动语义,当从参数初始化数据成员时,我们应该尝试移动值而不是复制它吗?

这是一个示例,展示了我将如何在 C++11 之前的版本中处理此问题:

struct foo {
std::vector<int> data;

explicit foo(const std::vector<int>& data)
: data(data)
{
}
};

这里会调用复制构造函数。

在C++11中,我们是否应该养成这样写的习惯:

struct foo {
std::vector<int> data;

explicit foo(std::vector<int> data)
: data(std::move(data))
{
}
};

在这里,如果传递的参数是左值,则将调用移动构造函数...以及复制构造函数,但好处是如果传递了右值,则将调用移动构造函数而不是复制构造函数.

我想知道我是否缺少某些东西。

最佳答案

我最初对您的问题的回答是:

不要复制要移动的数据。如果性能有问题,您可以使用右值引用添加构造函数:

explicit foo(std::vector<int>&& data)
: data(std::move(data)) // thanks to Kerrek SB
{
}

不完全符合您的问题,但阅读 Rule-of-Three becomes Rule-of-Five with C++11?似乎很有用。

编辑:

但是,接受的答案是 Passing/Moving parameters of a constructor in C++0x似乎提倡您的方法,尤其是使用多个参数时。否则会出现变体的组合爆炸。

关于c++ - 从参数初始化数据成员的 C++11 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7138376/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com