草庐IT

lambda表达式

全部标签

c++ - 调用 const 可变 lambda

为了简化测试用例,假设我有以下包装类:templatestructWrapper{decltype(auto)operator()()const{returnm_t();}decltype(auto)operator()(){returnm_t();}Tm_t;};templateautomake_wrapper(Tt){returnWrapper{t};}假设我包装了以下简单的仿函数返回引用:structFoo{int&operator()(){returnx;}constint&operator()()const{returnx;}intx;};在我的main函数中,我试图将Foo

c++ - 在单个函数中混合 '__try' 和 'try' - 通过 Lambda

众所周知,WindowsSEH不支持C++异常处理机制。我们不能在单个函数中使用try和__try。这将导致编译器错误:__try{try{MayThrowCPPException_OR_SEH();}catch(...){}}__except(EXCEPTION_EXECUTE_HANDLER){}它将呈现:C2713:Onlyoneformofexceptionhandlingpermittedperfunction.大多数人不喜欢的一个选项是“YeswithSEHExceptions(/EHa)”编译器选项。这将有助于C++try/catch处理这两个异常。我们需要将这样的函数放

c++ - 尽管用作 'typeid' 的操作数,但 ns3、c++、具有副作用的表达式仍将被评估

奇怪的事情发生了:我没有修改我的ns3c++代码的任何部分,并且运行编译这是出现的错误:[815/1681]cxx:scratch/initial-scenario.cc->build/scratch/initial-scenario.cc.1.oInfileincludedfrom../scratch/initial-scenario.cc:3:Infileincludedfrom./ns3/core-module.h:18:Infileincludedfrom./ns3/calendar-scheduler.h:24:Infileincludedfrom./ns3/schedule

c++ - 为什么我们可以将可选参数传递给新表达式而不是删除表达式?

已经在stackoverflow上就此主题提出了一些问题,但我还没有看到任何关于删除表达式限制背后的基本原理的解释。为了澄清这个主题,我试图在以下三个评论中收集我所理解的事实。备注1:通用新表达式让我们考虑任何“operatornew”(无论它是默认的全局操作符、覆盖默认全局操作符的版本、重载版本还是类成员版本)。假设我们也有一个匹配的“operatordelete”。假设原型(prototype)如下:void*operatornew(size_t,T1,T2,...,Tn);voidoperatordelete(void*,T1,T2,...,Tn);我们知道当程序员输入一个新的表

c++ - 可变/不可变 lambda 的编译时开关

我正在编写一个类成员函数,它将在函数参数中采用给定类型T的lambda。我的问题是:是否可以根据参数的可变性在编译时重载成员函数?下面是示例://Tisagiventypeforclass.templateclassWrapper{T_t;//ForT&template>std::enable_if_t::value>operator()(F&&f){f(_t);}//ForconstT&template>std::enable_if_t::value>operator()(F&&f)const{f(_t);}};所以,我想要的是,如果给定的lambda具有以下签名,则应调用第一个运算

c++ - 模板化 lambda 中的所有 lambda 是否也是模板化 lambda?

考虑这段代码(在GCC和MSVC上编译):intmain(){autofoo=[](autop){typedefdecltype(p)p_t;autobar=[](){returnstatic_cast(10);};returnbar();};std::coutfoo()是一个模板化的lambda,因为它有一个auto参数。但是要让bar()知道p_t类型,它也必须以某种方式隐式模板化,这让我想到了标题中的问题:模板lambda中的所有lambda是否也是模板lambda?如果是这样的话,那么如果我有很多嵌套的lambda,模板参数的数量似乎会增长得很快(不一定是坏事,但它让我感到惊讶

c++ - 将 lambda 函数转换为另一个编译单元中的普通函数是否会缩短编译时间?

我正在从事一个C++服务器项目,该项目一直受到不断增长的main()函数的困扰,并且代码库已经增长到编译时间约为6分钟的地步(在Debug模式下))即使我对main()函数做了最细微的更改。(main()函数大约有5000行长!)我使用的是VisualStudio2017,并且(据我了解)编译器具有一些预编译header功能,以及不重新编译未修改函数的功能。但是这些东西目前用处不大,因为大部分逻辑都在main()函数中。这是我的代码的(非常简化的)版本:structGrandServer{std::map>request;/*someotherfunctionsofthisserver

c++ - 指针算术 - 相同的表达式?

这些表达式的结果是否相同?&(*ptr)+=4//Expression1ptr+=4//Expression2我主要是一名Java开发人员,负责将一个旧项目从VS2008重新编译到VS2015。由于左操作数不是可修改的左值,上面的第一行导致编译错误。问题是我是否可以使用第二个表达式而不是第一个表达式,因为据我了解它们应该是相同的?ptr是char*类型。非常感谢您对此问题的任何见解和/或帮助。 最佳答案 &返回一个左值的地址,但它本身是不可修改的,所以(&a)++没有意义,因为你不能分配给&a。所以第一个表达式不是定义的操作。(因此

c++ - 如何使用 clang 格式分隔 lambda 的尾随返回类型

有几件事阻止我切换到clang格式。当我在应该换行到下一行的lambda上有一个尾随返回类型时,箭头和尾随返回类型之间没有空格。我该如何解决这个问题?例如,这是下面相同代码的未格式化版本的clang-format的输出autofunc(){return[.......](autoone,autolong_parameter_list,autoanother)->SomeLongReturnType;//^^^^^^^^^^^^^^^^^^^^^HowcanIaddaspaceinbetweenthose?} 最佳答案 TL;TR:升

c++ - 括号可以覆盖表达式的求值顺序吗?

这个问题在这里已经有了答案:OperatorPrecedencevsOrderofEvaluation(6个答案)关闭4年前。分组运算符和操作数以及求值的顺序是C++中表达式的两个重要概念。分组对于具有多个运算符的表达式,操作数如何与特定运算符分组由优先级和结合性决定运算符,并且可能取决于求值顺序。订单在C++中,只有4个运算符具有指定的求值顺序(逻辑与、逻辑或、条件运算符和逗号运算符)。对于其他运算符,评估顺序未指定。括号括号可以覆盖优先级和结合性,因此指定复合表达式的分组。然而,bookPeterGottschling声称括号可以改变评估的顺序。我个人对此表示怀疑;我认为这是一个错