草庐IT

lambda表达式

全部标签

c++ - MSVS 2015 表达错误 C4146 - 应用于无符号类型的一元减号运算符

有没有办法在MicrosoftVisualStudio2015-ExpressEdition中禁用错误​​C4146?我尝试将“将警告视为错误”选项设置为否,但MSVC仍将C4146视为错误。有什么解决办法吗? 最佳答案 对于新的MicrosoftVisualStudioCommunityEdition项目,“SDL检查”默认设置为“是(/sdl)”。这会将某些“安全相关”警告变成错误。将参数设置为“No(/sdl-)”,将它们转回警告。请参阅有关“SDLCheck”的Microsoft文档,当前为here.编辑:这个问题已经在评论

c++ - lambda 的仅类型模板参数

假设我有这个结构:structFoo{operatorint(){return11;}operatorunsignedint(){return22;}}foo;当此结构被转换为int时,它返回11,但当转换为unsignedint时,它返回22。使用普通函数,我可以使用模板和getter函数来选择:templateTget(){return(T)foo;}现在,当像get()这样调用这个函数时它会返回11,但是当像get()这样调用它时它会返回22.直到现在,当我尝试使用lambda时,一切都很好:autolambda=[](autotype){return(decltype(type

c++ - Lambda 按值捕获和 "mutable"关键字

lambda中对关键字mutable的需求是造成极大困惑的根源。考虑代码:intx=10;functionlambda=[=]()mutable{x++;cout输出:Beforelambda:x=10Insidelambda:x=11Afterlambda:x=10正如我们所见,变量x在lambda之后保持不变,因此没有副作用。但是,如果我们“忘记”了关键字mutable,就会出现错误。作为C++中默认的按值传递参数,对我来说需要mutable关键字没有意义。有人可以编写(即使是伪代码)编译器生成的类来代替lambda吗?谢谢 最佳答案

c++ 可以通过引用传递临时 lambda(适用于 msvc/windows 但不适用于 gcc/linux)吗?

假设我有以下代码片段://globalvariablestd::threadworker_thread;//Templatefunctiontemplatevoidstart_work(Functor&worker_fn)//lambdapassedbyref{worker_thread=std::thread([&](){worker_fn();});}这样调用:voiddo_work(intvalue){printf("Hellofromworker\r\n");}intmain(){//Thislambdaisatemporaryvariable...start_work([do

c++ - Lambda 通过引用捕获并在槽中使用

我有与此类似的C++14代码:voidC::f(){int&ref=this->x;autolb=[&ref](){/*dostuffwith"ref"*/};if(foobar){//calllbwhensignalfires.connect(object,&D::signal,[&lb](){lb();});}else{lb();}}我知道当我使用lb时,this仍然有效。但是ref和lb呢?上面的代码是否有任何悬空引用?我发现了类似的问题(here,there,...)但我无法得出结论。 最佳答案 lb有自动存储,所以当这个函

c++ - 直接从 C++0x lambda 调用方返回

我刚刚重写了以下从当前函数返回的C89代码://makesuretheinodeisn'topen{size_ti;for(i=0;ihtab);++i){structHandleconst*consthandle=&g_cpfs->htab[i];if(handle_valid(handle)){if(handle->ino==(*inode)->ino){log_info("Inode"INO_FMT"isstillopen,delayingremoval.",(*inode)->ino);returntrue;}}}}使用这个C++0xSTL/lambda混合体:std::for

c++ - 在 C++ 中优雅地移植 lambda 表达式

由于lambda表达式需要GCC版本>4.4:将包含几个带有引用绑定(bind)变量的lambda表达式的代码移植到C++0x之前的代码的最优雅或最快(但不太“脏”)的方法是什么?这可以使用模板/宏以半自动方式完成吗? 最佳答案 也许你应该看看boost::lambda.这应该可以满足您的需求。 关于c++-在C++中优雅地移植lambda表达式,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/que

c++ - 与本地 lambda 一起使用时,模板函数会导致编译器错误

我的previousquestion得出结论,将POSIXmakecontext与C++lambda函数(即函数对象)一起使用可能需要令人厌恶的“双重转换”。继续,我现在面临与以下最少代码相关的编译错误:#include#includeusingnamespacestd;templatevoidfoo(){ucontext_tc;autof=[=](inti){cout();return0;}错误是:error:invalidcastfromtype‘foo()[withT=int]::’totype‘void(*)(int)’但是,如果我从foo函数中删除未使用的(在本例中)模板参数

c++ - 表达式评估顺序

我最近对以下C++片段感到困惑:#includeintlol(int*k){*k+=5;return*k;}intmain(intargc,constchar*argv[]){intk=0;intw=k+lol(&k);printf("%d\n",w);return0;}看看线:intw=k+lol(&k);直到现在,我认为这个表达式将从左到右求值:获取k的当前值(在调用lol函数之前为0),然后将其添加到lol函数的结果中。但是编译器证明我错了,w​​的值是10。即使我切换位置来制作它intw=lol(&k)+k;结果仍然是10。我做错了什么?托梅克 最佳

c++ - 表达优先?这个结果是如何发生的?

在cpp中,以下代码片段的结果是:555但是在java中,相同代码片段的结果是:357我不知道为什么,有没有人可以解释一下?非常感谢!classH{public:H&pr(intn,char*prompt){cout 最佳答案 Incpp,theresultofthefollowingcodesnippetis:555Butinjava,theresultofthesamecodesnippetis:357Idonotknowwhy,因为C++不是Java:)您正在改变最后两个函数调用中的变量v。让我们看一下反汇编(在这里调试以更清