为何std::bind_front会执行拷贝?我对完美转发的理解有误?
为什么std::bind_front触发了拷贝构造?
你对std::bind_front的完美转发理解存在误区:它的完美转发是针对调用绑定函数时传入的参数,而非绑定阶段传递的实参。
默认情况下,std::bind_front会把你绑定的实参拷贝一份存储到生成的函数对象内部。你的代码里直接传了CustomObject实例A,所以bind_front会调用拷贝构造函数复制A,把这个拷贝存到boundFunc里。后续调用boundFunc时,再把这个内部的拷贝对象传给func的const引用参数——这就是拷贝构造被触发的原因。
如何避免拷贝?
如果想让bind_front直接引用原对象而不拷贝,需要用std::cref(针对const引用)或std::ref(针对非const引用)包装要绑定的对象:
修改main里的绑定代码:
auto boundFunc = std::bind_front(func, std::cref(A), 2, 2);
这样bind_front会存储A的const引用,调用boundFunc时直接把原对象A传给func的参数,不会触发拷贝构造。
验证代码
#include <iostream> #include <functional> class CustomObject { public: CustomObject(int value) : value(value) { std::cout << "Constructor: " << value << std::endl; } CustomObject(const CustomObject& other) : value(other.value) { std::cout << "Copy Constructor: " << value << std::endl; } private: int value; }; void func(const CustomObject& a, int b, int c) { std::cout << ", " << b << ", " << c << std::endl; } int main() { CustomObject A{ 5 }; auto boundFunc = std::bind_front(func, std::cref(A), 2, 2); boundFunc(); return 0; }
运行这段代码,只会输出构造函数的日志,拷贝构造不会被调用。
内容的提问来源于stack exchange,提问作者KimGiacinto
相关产品推荐
相关产品推荐

