草庐IT

c++ - 右值引用模板推导

templatevoidf(U&&v){std::cout::value){std::cout(int(1));}}intmain(){f(int(1));f(int(1));std::cin.ignore();}为什么v参数被解释为int当我没有明确使用f时?有什么不同?(用MVS2010编译)我的猜测是,First作为右值传递,second作为右值引用传递,并且都正确绑定(bind)到右值引用,对吗?谢谢。 最佳答案 不,不是真的。永远不会推导出右值引用。U&&的概念U是可推导的模板参数,用于指示U应该被推导,使得参数的右值是保

C++模板函数类型推导

我有这个代码:templateclasscallfn{public:voidoperator()(T*obj)const{f(obj);}};voidcall(int*foo){}voidtest(){callfnfun;fun(1);}这往往工作正常。然而,类型callfn到处都在使用,如果我能这样调用它,我会更喜欢callfnfun;相反,在不修改call类型的情况下,是否可以安排callfn模板,使其能够推断出T类型来自f? 最佳答案 在aaronman之上添加的post.尽管您不能单独使用模板类,但使用一些帮助程序(包括宏)

C++ - 通过 enable_if_t 推导参数包(可变参数模板)构造函数和复制构造函数

更新:谢谢你,大露营。这是最后的structA.structA{template>A(Args&&...args){cout,A>::value>>A(Arg&&arg){cout来源:关于这段代码,#include#include#includeusingnamespacestd;structA{template>,A>::value>>A(Args&&...args){cout输出是vvvvm在VC++14.0中。但是为什么输出不是vvccm?(我希望candd使用复制构造函数。而且我知道EffectiveModernC++Item27只使用一个转发引用。)

c++ - 关于C++17中类模板参数推导的问题

我正在尝试理解P0091r3(已被纳入当前C++标准草案N4606的“类模板的模板参数推导”论文)。我相信我理解它在最简单的可能情况下是如何工作的,其中template-name标识单个模板:templatestructS{S(T);S(conststd::vector&);};intmain(){std::vectorv;autos=S(v);}S标识主模板,因此我们创建一个虚构的重载集,其中包含templatevoidSctor(T);templatevoidSctor(conststd::vector&);并对虚构调用执行重载决议Sctor(v)确定在这种情况下我们要调用虚构的S

c++ - 编译器推导超出范围的变量的右值引用

为什么编译器不会自动推断出变量即将超出范围,因此将其视为右值引用?以这段代码为例:#includeintfoo(std::string&&bob);intfoo(conststd::string&bob);intmain(){std::stringbob("");returnfoo(bob);}检查汇编代码清楚地表明,const&版本的“foo”在函数末尾被调用。此处的编译器资源管理器链接:https://godbolt.org/g/mVi9y6编辑:澄清一下,我不是在寻找有关移动变量的替代方法的建议。我也不想理解为什么编译器选择foo的const&版本。这些是我理解得很好的事情。我有

c++ - 完美转发类模板参数推导

我想了解演绎指南如何与通用引用和std::forward一起工作,特别是创建完美的转发包装器。下面的代码提供了在两种情况下使用仿函数包装器进行试验的代码:一种使用隐式推导指南,另一种使用显式推导指南。我在注释里放了很多&&和std::forward,因为不知道哪里需要它们才能实现完美转发。我想知道将它们放在哪里,以及不需要它们的地方。//Casewithnotconversionconstructortemplatestructfunctor1{explicitconstexprfunctor1(F/*&&*/f)noexcept(std::is_nothrow_copy_constr

C++17 <functional> 模板参数推导不适用于 Xcode 10.1

我一直在尝试使用C++17(及更高版本)进行模板参数推导,并试图从cppreference.com编译这个确切的示例#includeintfunc(double){return0;}intmain(){std::functionf{func};//guide#1deducesfunctioninti=5;std::functiong=[&](double){returni;};//guide#2deducesfunction}它在该页面上的基于Web的编译器中编译并运行良好,但是当我尝试在我的MacbookPro上编译它时,它失败了,说error:noviableconstructor

c++ - 如何模拟模板别名的推导指南?

考虑以下几点:templatestructmy_array{Tvalues[N];};我们可以提供扣费指南my_array,像templatemy_array(Ts...)->my_array,sizeof...(Ts)>;现在,假设my_array有一些非常特殊的意义(但只是意义,接口(interface)和实现保持不变),所以我们想给它一个更合适的名字:templateusingspecial=my_array;Itturnsout推导指南根本不适用于模板别名,即这会产生编译错误:floatx,y;my_arraya{x,y};//worksspecialb{x,y};//does

c++ - 为什么在模板推导过程中没有选择正确的功能

我定义了两个重载模板函数。它们都以函数指针作为参数。不同之处在于,在第一个中,函数是类的成员,而在第二个中则不是。当我尝试传入非成员函数类的模板函数时,编译器会选择该函数是类成员的模板函数。结果产生了编译器错误。下面是代码#include#include#include#include#includeclassWorker{public:Worker(){}templatevoidQueueFunction(_Callable__f,Objectobj,_Args...__args){funcs.emplace_back([=]()mutable{(obj.*__f)(__args..

c++ - 返回类型推导

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:OmitreturntypeinC++11在C++11中,如果主体仅包含一个return语句,lambda可以推断出它们的返回类型。proposalistheworks删除这个限制,显然它已经在GCC中工作了。有什么原因不能扩展到所有auto返回函数吗?是否已提出此扩展?