c++ - 对象传输:通用引用或按值
问题描述
假设一个类只支持显式构造函数或移动语义。但不是默认构造函数或复制构造函数。
class Foo
{
private:
int* _data;
public:
Foo(int value) : _data(new int(value)) {}
Foo(Foo&& f) : _data(f._data)
{
f._data = nullptr;
}
~Foo() { delete _data;}
Foo(Foo& f) = delete;
Foo() = delete;
Foo& operator=(Foo& f) = delete;
};
现在假设有另一个组件需要承担上述类的实例的所有权。“Bar”的实例需要通过其构造函数获取 Foo 的所有权。
Foo f(42);
Bar b(std::move(f));
到目前为止,一切都很好。
但是 Bar 的构造函数应该如何声明呢?我以为是这样的:
class Bar
{
Foo _f;
public:
Bar(Foo&& f) : _f(std::move(f)) {}
};
但这也有效:
class Bar
{
Foo _f;
public:
Bar(Foo f) : _f(std::move(f)) {}
};
有什么区别,哪个更好?(或者什么时候选择一个而不是另一个?)我什至不知道后者是可能的,直到我观察到 Boost 的 Asio 库通过 value 将套接字传递给处理程序。socket 类具有与上面的 Foo 类类似的约束。
解决方案
推荐阅读
- amazon-web-services - 使用 EC2 实例名称和私有 IP 地址创建 awscli 表输出
- reactjs - redux-saga 总是返回 'undefined'
- javascript - 如何使用 javascript 淡入淡出
- cakephp - cakephp 3 补丁存储额外的列数据
- r - 如何在 R 中编写循环以根据列名创建多个不同的数据子集?
- java - AnysoftKeyboard (Android) 的构建问题
- bash - LDAP 转储的 Bash 脚本数据解析
- python - 用 Scrapy 和 Selenium 抓取 CNN
- pine-script - 每次出现新栏时标签都会重复
- php - 无法在本地 Apache 服务器中打开 PHP webapp。获取错误 404