我想编写一个辅助函数,例如:templateautohelper(constRange1&left,constRange2&right,F&&pred){usingnamespacestd;//forcbegin/cendandADLreturnpred(cbegin(left),cend(left),cbegin(right),cend(right));}它适用于容器:std::vectorv1={1,2,3,4,5,6};std::vectorv2={5,4,3,2,1,6};std::cout但它无法推断出initializer_list-s(example):std::cout
我最近发现,在lambda中按值捕获const对象意味着labmda主体(即lambda的数据成员)内的变量也是const.例如:constintx=0;autofoo=[x]{//xisconstint};此行为在draftforC++17的§8.1.5.2中提到。:Foreachentitycapturedbycopy,anunnamednon-staticdatamemberisdeclaredintheclosuretype.Thedeclarationorderofthesemembersisunspecified.Thetypeofsuchadatamemberisther
考虑this代码:#includetemplatestructBB{};templatestructBB:BB{};structDD:BB{};templatevoidff(BB){}intmain(){ff(BB{});ff(DD{});//FAILS!'BB'isanambiguousbaseclassof'DD'return0;}ff(DD{})的来电无法编译,因为gcc-8.3不想从BB中选择一个和BB(clang做同样的事情)。但是BB是BB,那么为什么只是BB选不出来?!问题是:这是否符合标准,在定义ff时是否有解决方法?或BB帮忙gcc-8.3挑选BB?
我有以下模板。templatestd::vectormap(conststd::vector&v,std::functionf){std::vectorres;res.reserve(v.size());std::transform(std::begin(v),std::end(v),std::end(res),f);returnres;}当我在我的代码中使用它时,我指定了模板参数。为什么编译器不能为我推断出这个?我必须如何更改我的模板定义才能使其正常工作?vectornumbers={1,3,5};//vectorstrings=map(numbers,[](intx){return
给定一个这样声明的模板函数:templateintFunction(Tobject);用户可以通过指定模板类型来调用此函数,如下所示:intresult=Function(100.f);//Valid但是类型说明是可选的,因为编译器可以从提供的参数类型推断出T的类型;像这样:intresult=Function(100.f);//Alsovalid,thecompilerdeducedthetype"float"fromtheliteral'stype假设我有点复杂,我想要一个像这样的模板化值参数:templateintFunction();我可以这样调用我的函数:staticfloa
有没有一种简单的方法可以强制编译器向我显示为模板参数推导的类型?例如,给定templatevoidf(T&¶meter);constvolatileint*constpInt=nullptr;f(pInt);我可能想看看在对f的调用中为T推导出什么类型。(我认为是constvolatileint*&,但我不确定。)或者给定templatevoidf(Tparameter);intnumbers[]={5,4,3,2,1};f(numbers);我可能想知道我对T在f的调用中被推断为int*的猜测是否正确。如果有第三方库解决方案(例如,来自Boost),我很想了解它,但我也想知道
比方说,我有一个容器c类型,它提供了一个size()方法,我想遍历这个容器,同时跟踪每个项目的索引:for(/*TODO*/i=0;i在后C++11时代,自动类型推导可以很好地解决许多问题。我们应该用什么来代替上面的TODO?无论size()的类型是什么,对我来说唯一正确的是:for(decltype(c.size())i=0;i但这似乎过于冗长,而且在我看来,不利于可读性。另一种解决方案可能是这样的:for(autoend=c.size(),i=0;i但这也无助于提高可读性,当然,与原始片段的语义也不相同。所以,我的问题是:在仅给定索引限制的类型的情况下,推断循环索引变量类型的最佳方
作为此question的跟进,我测试了clang和gcc的行为。看来这两个编译器对c++标准有不同的解释。在下面的示例中,如果根据推导指南假设的构造函数参数需要复制不可复制的参数,则GCC拒绝编译。Clang不执行此检查:#includestructnot_copyable{not_copyable()=default;not_copyable(constnot_copyable&)=delete;};structmovable{movable()=default;movable(movable&&);};templatestructA{templateA(Tsconst&...){}
好吧,这可能看起来像一个愚蠢的问题,但它是这样的:templatevoidfoo(T&x){}intmain(){foo(42);//errorinpassingargument1of'voidfoo(T&)[withT=int]'}是什么阻止C++使用T=constint实例化foo函数模板? 最佳答案 问题在于模板类型推导必须计算出精确匹配,并且在那种特定情况下,由于签名中的引用,精确匹配需要一个左值。值42不是左值,而是右值,解析T与constint不会产生完美的匹配。由于模板类型推导仅限于完全匹配,因此不允许推导。如果不使用
我之前看到过这段代码的等价物,得知它按预期工作时我有点惊讶:#includeintmain(){inta=10;[=]()mutable{[&](){a+=10;std::cout如我们所愿,输出是nestedlambda:a=20a=10令我惊讶的是,编译器发现a在嵌套的lambda中使用,并在第一个lambda中正确地按值捕获它,即使它没有在那里明确使用。即,编译器必须在嵌套lambda中的a和外部作用域中的a之间建立连接。我认为参数捕获需要是显式的(即第一个lambda中的[a],嵌套中的[&a]),它才能工作。自动参数捕获的推导规则是什么? 最佳答案