标准::函数复制参数
std::function copying parameters?
我的代码:
#include <iostream>
#include <functional>
using namespace std;
struct A {
A() = default;
A(const A&) {
cout << "copied A" << endl;
}
};
void foo(A a) {}
int main(int argc, const char * argv[]) {
std::function<void(A)> f = &foo;
A a;
f(a);
return 0;
}
我在控制台上看到"复制的 A"两次。为什么对象被复制两次,而不是一次?如何正确防止这种情况?
专用化std::function<R(Args...)>
有一个调用运算符,其声明如下:
R operator()(Args...) const;
在您的情况下,这意味着操作员需要A
.因此,由于按值传递语义,调用f(a)
会导致副本。但是,基础foo
目标也按值接受其参数。因此,当要f
的参数转发到foo
时,将有第二个副本。
这是设计使然,事实上,如果A
有一个移动构造函数,则只有一个副本,后跟一个移动构造 - 调用f(std::move(a))
只会导致两个移动构造。如果你觉得两份副本太多了,你需要重新考虑foo
和f
是否都应该A
而不是例如 A const&
,和/或A
是否可以有一个明智的移动构造函数。
您也可以在不修改foo
的情况下执行std::function<void(A const&)> f = &foo;
。但是,您应该保留这一点,以便在您无法控制的情况下修改foo
和/或使A
廉价移动可构造不是一种选择。在 C++11 中按值传递并没有错,所以我建议要么两者都应该A
,要么两者都应该A const&
。
它被复制,因为你按值传递它。您可以通过将其作为 const 引用传递来避免所有副本。
相关文章:
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么默认复制函数在按值发送参数时不调用?
- std::p ackaged_task 应该删除带有 const 参数的复制 c'tor
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 如何确定捕获不可复制参数的 lambda 的类型?
- 复制 avcodec 参数
- 从函数参数 [C++] 复制整数数组
- 候选构造函数(隐式复制构造函数)不可行:第一个参数需要 l 值
- 使用另一个类中的参数复制构造函数
- 在 c++ 中从参数复制本地数组比从数组更快?
- 是否可以避免将参数复制到 lambda 函数?
- 可以使用默认参数复制包含 lambda 的 std::函数吗?
- C 指针节点帮助 - 将参数复制到链接的列表节点更改该节点的不同部分
- gcc 的 std::bind 在源中的哪个位置将参数复制到数据结构中?
- std::绑定参数复制行为
- 使用参数复制构造函数作为对派生类的引用
- 将指针类参数复制到类成员的好处
- 使用 2 参数复制构造函数
- 函数参数:复制或指针