草庐IT

lambda表达式

全部标签

C++11 lambda 不明确

为什么编译器不能选择最明显的重载:#include#includestaticvoidfoo(conststd::function&f){std::cerr&f){std::cerr你会期望输出:usingbooloverloadtrueusingintoverload1但是,编译器无法推断出正确的重载:gcc-4.8:main.cpp:Infunction'intmain()':main.cpp:17:6:error:callofoverloaded'foo(main()::__lambda0)'isambiguous});^main.cpp:17:6:note:candidates

c++ - gcc 4.8 或更早版本是否存在关于正则表达式的问题?

我正在尝试在一段C++11代码中使用std::regex,但该支持似乎有点问题。一个例子:#include#includeintmain(intargc,constchar*argv[]){std::regexr("st|mt|tr");std::cerr输出:st|mt|trmatchesst?1st|mt|trmatchesmt?1st|mt|trmatchestr?0当使用gcc(MacPortsgcc474.7.1_2)4.7.1编译时,要么使用g++*.cc-otest-std=c++11g++*.cc-otest-std=c++0x或g++*.cc-otest-std=gn

c++ - 在 QWidgets 线程实例上运行 lambda 函数槽

目前我正在创建一个线程。如果该线程想要与主线程通信以便与GUI交互,它会发出连接到主小部件线程上的插槽的信号。这一切正常。但是,对于此解决方案,我必须返回到我的原始GUI表单并向其添加插槽。我想知道我是否可以使用lambda函数简单地做到这一点。例如,在下面的示例中,类foo是在一个单独的线程上启动的。像这样QObject::connect(this,&myclass::someSignal,[](std::stringmsg){QMessageBox::information(mptr,"Sometitle",msg.c_str(),QMessageBox::StandardButt

c++ - 无法在 VS 14 CTP : conditional expression of type 'void' is illegal 中使用 auto 声明 lambda

使用VisualStudio2014CTP、C++(v140)编译器:autogp=[&](BYTE*buff){autogp1=[](char*bff,char**p1){*p1=strstr((char*)bff,"(");return(*p1);};};错误:conditionalexpressionoftype'void'isillegal(也许auto真的输入错误?)如果我将内部lambda声明为std::functiongp1然后就可以了是我做错了什么还是编译器错误? 最佳答案 我没有运行2014,但您可能需要指定内部l

C++, 'if' 表达式中的变量声明

这是怎么回事?if(inta=Func1()){//Works.}if((inta=Func1())){//Failstocompile.}if((inta=Func1())&&(intb=Func2()))){//Dostuffwithaandb.//ThisiswhatI'dreallyliketobeabletodo.}2003标准中的第6.4.3节解释了在选择语句条件中声明的变量如何具有扩展到条件控制的子语句末尾的范围。但我看不出它在哪里说了不能在声明两边加上括号,也没有说每个条件只能有一个声明。即使在条件中只需要一个声明的情况下,这种限制也很烦人。考虑一下。boola=fal

c++ - 是否可以在 lambda 中找到捕获变量的数量/类型?

在按值访问或按引用访问时,是否可以自动实现lambda捕获的变量个数?还有可能破译他们的类型吗?例如,假设这段代码:inta=47;intb=48;longlongc=49;autof1=[=](){returna+b;};autof2=[=](){returna+b+c;};如果像下面这样调用,是否可以有一个名为count_args的函数,它在一行中返回2并在下一行返回3?std::cout 最佳答案 不,因为这个问题隐含地假设捕获的变量实际上是成员变量。然而,编译器被授予了更大的自由度。正如Ajay在评论中指出的那样,一个体面的

C++11 "overloaded lambda"带有可变参数模板和变量捕获

我正在研究一个可能被称为“重载lambda”的C++11习语:http://cpptruths.blogspot.com/2014/05/fun-with-lambdas-c14-style-part-2.htmlhttp://martinecker.com/martincodes/lambda-expression-overloading/使用可变参数模板重载n函数似乎对我很有吸引力,但事实证明它不适用于变量捕获:[&]中的任何一个|[=][y][&y](和[this]等,如果在成员函数中)导致编译失败:error:nomatchforcallto'(overload,main(in

c++ - g++ 不允许在 lambda 中通过引用广义捕获 const 对象?

这被g++(4.9.3和5.2.0)拒绝,但被clang3.5.0接受:intmain(){constintci=0;autolambda=[&cap=ci](){};}g++给出错误:将“constint”绑定(bind)到“int&”类型的引用会丢弃限定符。看起来g++拒绝允许捕获非常量引用,当然除了使用普通的旧C++11捕获[&ci]。这似乎是一个非常奇怪的约束,也许是g++中的错误? 最佳答案 您的代码有效。§5.1.2/11去Aninit-capturebehavesasifitdeclaresandexplicitlyc

c++11 正则表达式和 GCC

根据https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011C++11标准的正则表达式引擎应该在GCC中完成。现在,有人可以向我解释为什么这个简单的例子#include#include#includeusingnamespacestd;intmain(){stringstring_array[]={"http://www.cplusplus.com/reference/regex/regex_match/","tcp://192.168.2.1:1234/hello/how/are/you",

c++ - 如何编写丢弃其参数的通用可变参数 lambda?

我想编写一个lambda,它通过通用引用接受任意数量的参数并完全忽略它们。显而易见的方法是使用可变通用参数包的语法并省略参数名称:automy_lambda=[](auto&&...){return42;};在我trytopassanontrivially-copyableobject之前这工作正常(使用gcc4.9.2):structS{S(){}S(Sconst&){}};my_lambda("meow",42,S{});^error:cannotpassobjectsofnon-trivially-copyabletype'structS'through'...'这是怎么回事?我