草庐IT

lambda表达式

全部标签

c++ - 模板 lambda 有时无法编译

我想为我的trie数据结构实现一个通用的访问者模式。下面是提取的最小片段,这给编译器带来了麻烦:#includestructNode{size_tlength;};templateclassC{public:size_tlongest=0;std::functionf=[this](Nnode){if(node->length>this->longest)this->longest=node->length;};};intmain(){Noden;n.length=5;Cc;c.f(&n);}它使用g++(Ubuntu/Linaro4.7.2-2ubuntu1)、Ubuntuclang

c++ - 广义 lambda 捕获的宏

我想使用C++14中引入的广义lambda捕获(有关解释,请参阅Movecaptureinlambda)。但是,我的代码的其余部分是C++11友好的。我想按照以下方式做一些事情#ifdefCPP14//movecaptureinlambda#else//captureby-value#endif但是,没有好的交叉编译器标志来推断版本。有什么可以建议的吗?(当然,除了定义我自己的宏) 最佳答案 实际上T.C.是的,C++11FDIS在"16.8Predefinedmacronames[cpp.predefined]"中说那个Thena

c++ - 广义 lambda 的 vector

假设我们有这样一段代码:std::vector>tasks;然后我们添加这样的任务:tasks.push_back([](){//...}这行得通。但现在我们要添加该任务:std::unique_ptrv(newint(10));tasks.push_back([v=std::move(v)](){//...}并且这段代码没有编译。为了更清楚:std::unique_ptrv(newint(10));std::functiontest=[v=std::move(v)](){};存在编译错误。因为lambda的类型不是std::function.但是什么是类型呢?

c++ - 如何将变量移动到 lambda 表达式中?

我看到C++11文档(http://en.cppreference.com/w/cpp/language/lambda)的lambda表达式状态支持按值和引用捕获,但不支持右值引用。我能找到的与此相关的最接近的SO问题是:Howtocaptureaunique_ptrintoalambdaexpression?,但我的用例似乎不需要使用std::bind。代码#include#includeclassFoo{public:explicitFoo(intvalue=0):mValue(value){}//Thefollowingitemsareprovidedjusttobeexplic

c++ - 使用正则表达式进行全词匹配

我想要一个C++正则表达式来匹配“bananas”或“睡衣”,但不匹配“bananas2”或“bananaspajamas”或“banana”或除了这两个词之外的任何内容。所以我这样做了:#includeintmain(intargc,char**argv){staticconststd::regexbp=std::regex("\bbananas\b|\bpajamas\b");printf("%d\n",std::regex_match("bananas",bp));}除了它打印了0!是什么赋予了?/\bbananas\b|\bpajamas\b/.test('bananas')在

c++ - 通过 clang-format 格式化 lambda 背后的逻辑是什么?

我在Emacs(24.5.2版)中使用clang-format(3.5版)。下面是一段由clang-format以LLVM风格格式化的简单代码:intmain(){std::cout";std::stringword;while(std::cin>>word){std::cout";}return0;}请注意它是如何对齐lambda的正文和右括号的。这种格式是否有任何逻辑,或者它只是缺乏对lambda的支持?我需要设置clang-format的配置参数以获得更好的格式吗? 最佳答案 std::accumulate(word.cbeg

c++ - Boost fusion 使用 lambda fold 参数包

在下面的代码中(C++14,C++17中没有“fold”),我试图在编译时使用boostfusionfold、参数包自动计算类字段的固定偏移量和一个lambda。不幸的是,这会导致编译时错误......是否可以这样做?[编辑:其他事情也困扰着我:这不是我想要的。我希望ControlledLayout2的_size在编译时可用(这就是我将其设为静态的原因),而不仅仅是在调用构造函数时可用]templatestructField2{typedefT_type;staticconstuint32_t_size;staticuint32_t_offset;};templateconstuint

c++ - GCC 无法优化涉及成员函数指针的委托(delegate) lambda 函数

我使用GCC4.9.2和clang3.6.0编译了以下c++14代码。我使用了-O3标志。#includestructS{inta;intA()const{returna;}};templateintFunc(F&&f,Args&&...args){returnf(std::forward(args)...);}usingPtrA=int(S::*)()const;intF(Sconst&s,PtrAptr){return(s.*ptr)()*5;}intp(Sconst&s){returns.A()*5;}intP1(Sconst&s){returnFunc(&F,s,&S::A);

c++ - (int&&)5 是整数常量表达式吗?

g++接受代码:charb[static_cast(5)];N3936[expr.const]/3将术语定义为:Anintegralconstantexpressionisanexpressionofintegralorunscopedenumerationtype,implicitlyconvertedtoaprvalue,wheretheconvertedexpressionisacoreconstantexpression.[Note:Suchexpressionsmaybeusedasarraybounds[...]我不确定,因为表达式看起来像是int&&类型但是3.9中整数类

c++ - 基于范围的 for 循环表达式中的临时可选

假设我们有一个返回std::optional的函数.那么在基于范围的for循环中使用结果的正确方法是什么?最简单的方法不起作用:for(auto&&e:a().value()){//^---A&&isreturned,soAisdestructed//beforeloopstarts如果我们有Toptional::value()&&,这个问题就不会存在而不是T&&optional::value()&&,但STL和Boost都以第二种方式定义它。处理这种情况的正确方法是什么?我不喜欢我能想到的两种解决方案(sandbox):std::experimental::optionala(){/