深入理解 C++ 中的 std::cref、std::ref 和 std::reference_wrapper 在C++ 编程中,有时候我们需要在不进行拷贝的情况下传递引用,或者在需要引用的地方使用常量对象。为了解决这些问题,C++ 标准库提供了三个有用的工具:std::cref、std::ref 和std::reference_wrapper。这篇文章将深入探讨这些工具的用途、区别以及...
7.3 Using std::ref() and std::cref() 7.3使用std::ref()和std::cref() Since C++11, you can let the caller decide, for a function template argument, whether to pass it by value or by reference. When a template is declared to take arguments by value, the caller can use std::cref(...
std::ref 用于包装按引用传递的值。 std::cref 用于包装按const引用传递的值。 为什么需要std::ref和std::cref bind()是一个函数模板,它的原理是根据已有的模板,生成一个函数,但是由于bind()不知道生成的函数执行的时候,传递进来的参数是否还有效。所以它选择参数值传递而不是引用传递。如果想引用传递,std::ref...
出于这个原因,std::ref()和std::cref()通常只有在将对象通过泛型代码传递给非泛型函数时才能适用。比如,尝试直接输出泛型类型T的对象会失败,因为std::reference_wrapper<>没有输出运算: template<typenameT>voidprintV(Targ){std::cout<<arg<<'\n';}...std::strings="hello";printV(s);// OKprintV(std...
它们在头文件中声明,但std::cref()并非改变模板参数处理,而是通过创建std::reference_wrapper对象,以值传递这个包装,使其行为类似引用。这种包装允许在需要时隐式转化为原始类型,如std::string,但仅限于特定场景,如非泛型函数接收。需要注意的是,std::ref()和std::cref()在编译时需要明确其隐...
C++本身就有引用(&),那为什么C++11又引入了std::ref(或者std::cref)呢? 主要是考虑函数式编程(如std::bind)在使用时,是对参数直接拷贝,而不是引用。下面是一个简单的例子: #include<functional>#include<iostream>voidfun(int& n1,int& n2,constint& n3){ ...
数周后我们收到通知,概略算计出,如果我在六十二岁时退休,每月可能收到四百美元的社会福利金。我的TIAA和CREF年金计划可让我每个月多添两百美元。这些还不到我们每个月最低生活费的一半,更不要说房屋税和其他杂项支出。#黄仁宇 #黄河青山:黄仁宇回忆录(精装版)(书籍) #中年失业 ...
从C++11开始,对于函数模板参数,你可以让调用者自己决定是按值还是按引用来传递。当模板被声明按值传递时,调用者可以使用std::cref()和std::ref()(声明在<functional>头文件中)将参数按引用传递给函数模板。例如: template<typename T>voidprintT (T arg) { ...
说明std::bind使用的是参数的拷贝而不是引用。具体为什么std::bind不使用引用,可能确实有一些需求,使得C++11的设计者认为默认应该采用拷贝,如果使用者有需求,加上std::ref即可。 &是类型说明符, std::ref 是一个函数,返回 std::reference_wrapper类型。另外std::cref() 用于const引用的版本。
std::ref:用于包装按引用传递的值。 std::cref:用户包装按const引用传递的值。 对于std::bind或std::thread中只能使用std::ref 和 std::cref 不能使用&。 std::ref 和 std::cref 只是尝试模拟引用传递,并不能真正变成引用,在非模板情况下,std::ref根本没法实现引用传递,只有模板自动推到类型时,ref能包装...