草庐IT

lambda表达式

全部标签

c++ - VC 2013 与 2015 中的 Lambda 删除器

我正在将一些旧代码从VC2013移至2015。下面的简化代码在VC2013中运行良好,但在2015年失败:errorC2664:'voidmain::::operator()(main::D*&)const':cannotconvertargument1from'main::D*'to'main::D*&'我不是在寻找解决方案,而是在寻找更改内容和更改原因的解释。谢谢。#includeintmain(){classD{};automydel=[](D*&p){deletep;p=0;};std::unique_ptrup(newD);return0;} 最佳

c++ - Lambda 的 "this"捕获返回垃圾

我正在实现我自己的类,该类提供其成员的惰性初始化。而且我遇到了在lambda中捕获this的奇怪行为。这是一个重现此错误的示例。//Baz.h#include#include#include"Lazy.hpp"structFoo{std::stringstr;Foo()=default;Foo(std::stringstr):str(str){}Foo(Foo&&that):str(that.str){}};classBaz{std::stringstr;Lazy>foo;public:Baz()=default;Baz(conststd::string&str):str(str){/

c++ - 是否存在无法避免 lambda 中的尾随返回类型语法的情况?

关于之前的问题(IsitpossibletoreturnanobjectoftypeTbyreferencefromalambdawithoutusingtrailingreturntypesyntax?),我想知道是否还有任何其他重要的案例或示例,其中trailing-return-type语法在使用lambda时可以不被避免。 最佳答案 在C++14中,一个有点人为的例子是将sfinae与通用lambda结合使用:[](auto&&arg)->decltype(arg.f(),void()){/*dowhateveryouwan

c++ - 二进制表达式 ('const char*' 和 'const char *' 的无效操作数)

这个问题在这里已经有了答案:Can'taddstringsinC++(7个答案)关闭4年前。我想用简单的语言知道这个错误的原因。#include#includeintmain(){std::stringexclam="!";std::stringmessage="Hello"+",world"+exclam;std::couttest.cpp:55:35:error:invalidoperandstobinaryexpression('constchar*'and'constchar*')std::stringmessage="Hello"+",world"+exclam;

c++ - 带约束的可变参数模板的 'requires' 表达式的语法是什么?

如果我有一个可变参数模板;templateconceptFooable=requires(Tt){t.bar()->bool;};structFoo{intbig_foo;templateexplicitFoo(T&&i,U&&...f)noexcept:big_foo{std::forward(i)}{Something::something(std::forward(f)...);...}};然后模板的定义及其约束按预期工作。但是如果我“要求”对Foo有更多限制,那么使用“要求”表达式格式,例如;templaterequiresstd::Integral&&Fooable&&Bil

C++ 为什么第二个表达式无效?

假设您有以下对象层次结构:classVehicle{public:virtual~Vehicle(){}};classLandCraft:publicVehicle{};classTruck:publicLandCraft{};现在,我们有两个表达式:Trucktruck;Vehicle&vehicle=truck;根据一个作业的解法,第二个表达式无效。但为什么?我的编译器根本没有提示,我看不出这里应该有什么问题。 最佳答案 看来作业的答案是错误的。从派生的实例初始化对基类型的引用没有错。编辑正如一些人(尤其是Slaks)所指出的,

c++ - lambda:应该通过引用捕获 const 引用产生未定义的行为吗?

我刚刚在我的代码中发现了一个讨厌的错误,因为我通过引用捕获了对字符串的const引用。当lambda运行时,原始字符串对象早已不复存在,引用的值是空的,而目的是它将包含原始字符串的值,因此出现错误。让我感到困惑的是,这并没有在运行时引发崩溃:毕竟,这不应该是未定义的行为,因为afaik有一个悬空引用吗?此外,在调试器下查看id时,它看起来甚至不像垃圾,而是像一个正确构造的空字符串。这是测试用例;这只是打印一个空行:typedefstd::vector>functions;voidAddFunction(conststd::string&id,functions&funs){funs.p

c++ - 编译器可以/是否简化涉及函数的逻辑表达式?

一些计算bool值的函数:boola(){returntrueorfalse;}boolb(){//...}boolc(){//...}这种情况//somewhereelseif((a()&&b()&&c())||(a()&&b()&&!c())){doSomething();}也可以写成if(a()&&b()){doSomething();}编译器通常会优化它吗?那么纯bool值呢:if((a&&b&&c)||(a&&b&&!c)){doSomething();} 最佳答案 由于函数可能有副作用,因此不能以任何方式“优化”条件,因

c++ - 表达式中的多个后缀递增运算符[C++]

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Couldanyoneexplaintheseundefinedbehaviors(i=i+++++i,i=i++,etc…)我现在正在上我的讲师课,我的讲师提到了一个表达如下:inta,b;a=4;b=a+++a--;问题我的讲师说这个表达式值可以定义:它是8。这意味着在递增和递减之前将值4相加并分配给b。但对我来说,我认为这个表达式答案有点模糊,结果将基于编译器实现。那是因为对我来说,编译器可能首先执行a++部分——也就是说,使用值4并将a递增到5,之后表达式为4+5=9并分配给b然后只有a递减。它也可能

快速学习正则表达式 (源自github)

目录什么是正则表达式1.基本匹配2.元字符2.1点运算符.2.2字符集2.2.1否定字符集2.3重复次数2.3.1*号2.3.2+号2.3.3?号2.4{}号2.5(...)特征标群2.6|或运算符2.7转码特殊字符2.8锚点2.8.1^号2.8.2$号3.简写字符集4.零宽度断言(前后预查)4.1?=...正先行断言4.2?!...负先行断言4.3?4.4?5.标志5.1忽略大小写(CaseInsensitive)5.2全局搜索(Globalsearch)5.3多行修饰符(Multiline)6.贪婪匹配与惰性匹配(Greedyvslazymatching)前言:ummm不得不感叹,想在网上