草庐IT

弱引用

全部标签

c++ - 使用 std::function 或转发引用作为高阶函数的通用可调用对象输入参数?

我想知道编写一个以std::function作为输入参数的高阶函数的主要区别、优缺点。或转发引用,例如templatevoidhof(F&&fun);.显然,前者比后者更严格,因为它指定了输入可调用对象必须符合的函数类型。 最佳答案 std::function通常具有显着的运行时开销。通过template参数传递通用可调用对象可避免std::function的间接成本,并允许编译器积极优化。我在theendofthisarticle为lambda递归编写了一些简单的基准测试(Y组合器与std::function).std::func

c++ - 引用模板参数类型的 static_assert

我正在尝试做的是这个简单的模板钳制功能。我想确保upper>=lower在运行时和编译时。templateTclamp(constT&lower,constT&upper,constT&n){weak_assert(upper>=lower);returnstd::max(lower,std::min(n,upper));}这样写似乎合理:static_assert(upper>=lower,"invalidbounds");但是,当使用非constexpr调用时参数,编译器给我这个:Static_assertexpressionisnotanintegralconstantexpre

c++ - 为什么转发引用需要 std::forward

这个问题在这里已经有了答案:Whatarethemainpurposesofstd::forwardandwhichproblemsdoesitsolve?(7个答案)关闭5年前。在这样的函数模板中templatevoidfoo(T&&x){bar(std::forward(x));}不是xfoo中的右值引用,如果foo用右值引用调用?如果使用左值引用调用foo,则无论如何都不需要强制转换,因为x也将是foo内部的左值引用.还有T将被推导为左值引用类型,因此std::forward不会改变x的类型.我使用boost::typeindex进行了测试使用和不使用std::forward时,

c++ - 隐式模板推导指南可以推导引用类型吗?

在使用gcc7测试C++17推导指南行为时,我发现这个例子失败了:templatestructS{S(T&&v){}};inti=10;autov=S(i);根据我从cppreference读到的内容,我以为v应该是S类型.然而gcc7不编译此代码提示int&不能绑定(bind)到int&&(通用引用机制失效)。所以我的问题是:gcc7应该推导出v类型为S?工作草案标准中哪里描述了自动扣除指南? 最佳答案 [over.match.class.deduct]中的规则是:Asetoffunctionsandfunctiontemplat

c++ - 无法将类型 'int&' 的非常量左值引用绑定(bind)到类型 'int' 的右值

以下代码编译失败:#includeusingnamespacestd;intadd2(constint&x){returnx+2;}templateTadd2T(T&&x){returnadd2(std::forward(x));}intmain(intargc,char**argv){intx=0;cout通过这条消息:main.cpp:Ininstantiationof'Tadd2T(T&&)[withT=int&]':main.cpp:26:20:requiredfromheremain.cpp:12:16:error:cannotbindnon-constlvaluerefer

c++ - 为什么模板别名特化取决于引用它的上下文?

考虑这个示例代码:templateusingpt_type=typenameT::type;templateclassV{usingtype=int;public:usingpt=pt_type;};voidg(){V::pta;//Doescompilept_type>b;//Doesnotcompile}V::pt是pt_type>的别名.然而,它被定义的事实取决于它被引用的上下文。C++标准中哪里解释了模板实参替换模板实参是在引用别名特化的上下文中执行的? 最佳答案 无处可去。这是coreissue1554.Theintera

c++ - 引用 unique_ptr 的 vector

我有一组unique_ptr。在这里我想拿走其中的一些并将它们返回给调用者。调用者只需要读取内容,所以我想使用常量引用。但我不确定如何使用unique_ptr来做到这一点。这是我用来使用原始指针执行此操作的一些代码:classentry{};vectormaster;constvectorget_entries(){vectorentries;//peusocode,mastercontainsallentries.//onlysomeentriesarecopied,filteredbysomepredicatecopy_if(master.begin(),master.end(),

c++ - std::map::const_iterator 泄露了对值的非常量引用?

我观察到std::map::const_iterator泄漏了对value_type的非常量引用:#include#includeintmain(intargc,char*argv[]){std::mapfoo={{1,1},{4,2}};constauto&m=foo;constauto&it=foo.find(1);printf("%d%d\n",it->first,it->second);int&i=it->second;i=3;auto&one=foo.at(1);printf("%d%d\n",1,one);return0;}输出$g++test.cc&&./a.out111

c++ - 当特征相同时,如何在为引用和非引用类型编写特征时减少重复

我有例子#includetemplatestructBase{};templatestructBase{staticconstintvalue=true;};templatestructBase{staticconstintvalue=true;};intmain(){boola=Base::value;boolb=Base::value;std::couthttps://godbolt.org/z/0NpYxB请注意,我有两个相同的专业,想将其缩减为一个。我知道有两种解决方案,但我不想这样做。(1)删除调用点的引用,这样只需要一个特化。(2)创建一个基类并从中继承reference和

c++ - 在包含 shared_ptr 的 map 上使用 find_if 会增加引用计数

我正在创建一个程序,它有一个包含shared_ptr的映射。当我尝试使用std::find_if在其中查找元素时,shared_ptr的引用计数会增加。示例:#include#include#include#includeintmain(void){std::map>map;map[1]=std::make_shared(3);map[2]=std::make_shared(5);map[4]=std::make_shared(-2);autoit=std::find_if(map.begin(),map.end(),[](conststd::pair>&elem){std::cout