草庐IT

lambda-calculus

全部标签

c++ - 如何指定 vc11 lambda 调用约定

我想将嵌套在类中的lambda函数指针传递给WindowsAPI回调函数。我发现没有地方可以指定__stdcall关键字。有人告诉我编译只支持__cdecl,但是我用nm命令转储obj文件后,发现编译会生成三个辅助函数(__stdcall,__cdecl,__fastcall)同时进行。所以我的问题是,如何指定调用约定?以下代码是我的测试代码。#include"stdafx.h"int_tmain(intargc,_TCHAR*argv[]){autofunc=[](){};return0;}00000000t?@@@CAXXZ00000000t?@@@CIXXZ00000000t?@

可以将 C++11 lambda 分配给签名不正确的 std::function

以下编译并运行(在AppleLLVM版本6.1.0和VisualC++2015下):#include#includestructs{intx;};intmain(intargc,char**argv){std::functionf=[](consts&p){std::cout为什么没有赋值std::functionf=[](consts&p){std::cout产生错误?接受右值引用的函数不应该与接受const左值引用的函数具有相同的签名,不是吗?删除const来自lambda的声明确实会产生预期的错误。 最佳答案 扩展现有评论和答

可以将 C++11 lambda 分配给签名不正确的 std::function

以下编译并运行(在AppleLLVM版本6.1.0和VisualC++2015下):#include#includestructs{intx;};intmain(intargc,char**argv){std::functionf=[](consts&p){std::cout为什么没有赋值std::functionf=[](consts&p){std::cout产生错误?接受右值引用的函数不应该与接受const左值引用的函数具有相同的签名,不是吗?删除const来自lambda的声明确实会产生预期的错误。 最佳答案 扩展现有评论和答

c++ - 可以将currying与lambda函数一起使用吗?

这段代码编译失败,不知道是因为不能编译,lambdas没有从binary_function继承,还是我语法错误#includeintmain(intargc,constchar*argv[]){autolambda=[](intx,inty)->int{returnx+y;};autosumFive=std::bind1st(lambda,5);return0;} 最佳答案 用途:autosumFive=std::bind(lambda,5,std::placeholders::_1);请完全忘记bind1st和binary_fun

c++ - 可以将currying与lambda函数一起使用吗?

这段代码编译失败,不知道是因为不能编译,lambdas没有从binary_function继承,还是我语法错误#includeintmain(intargc,constchar*argv[]){autolambda=[](intx,inty)->int{returnx+y;};autosumFive=std::bind1st(lambda,5);return0;} 最佳答案 用途:autosumFive=std::bind(lambda,5,std::placeholders::_1);请完全忘记bind1st和binary_fun

c++ - 通用 lambda 可以没有参数吗?

首先,我知道我可以使用模板类/仿函数,但这不是我想要的。这是lambda:autolambda=[](autovar){decltype(var)x;//dostuffwithxbutnothingwithvar};问题是我收到警告C4100(未引用的形式参数)。我也知道我可以使用一些技巧,例如禁用警告并在lambda之后再次启用它或使用诸如UNREFERENCED_PARAMETER之类的宏,但这是作弊。有什么办法可以做到吗?理想的代码应该是这样的:templateautolambda=[](){Tx;//dostuffwithx}; 最佳答案

c++ - 通用 lambda 可以没有参数吗?

首先,我知道我可以使用模板类/仿函数,但这不是我想要的。这是lambda:autolambda=[](autovar){decltype(var)x;//dostuffwithxbutnothingwithvar};问题是我收到警告C4100(未引用的形式参数)。我也知道我可以使用一些技巧,例如禁用警告并在lambda之后再次启用它或使用诸如UNREFERENCED_PARAMETER之类的宏,但这是作弊。有什么办法可以做到吗?理想的代码应该是这样的:templateautolambda=[](){Tx;//dostuffwithx}; 最佳答案

c++ - 为什么 C++ lambda 不支持 move 捕获?

当前的C++11标准不支持在lambda表达式中move捕获变量,例如unique_ptrmsg(newint[1000000]);async_op([&&msg]{//compileerror:movecaptureisnotsupported/*dosomething*/});由于消息传递和唯一所有权在某些异步系统设计中具有一些关键作用,我认为move语义应该被视为一流的语言语义。但是lambda不支持move捕获。当然我知道使用move捕获代理有一些解决方法-但我想知道原因决定此功能不包含在C++11标准中,尽管它很重要. 最佳答案

c++ - 为什么 C++ lambda 不支持 move 捕获?

当前的C++11标准不支持在lambda表达式中move捕获变量,例如unique_ptrmsg(newint[1000000]);async_op([&&msg]{//compileerror:movecaptureisnotsupported/*dosomething*/});由于消息传递和唯一所有权在某些异步系统设计中具有一些关键作用,我认为move语义应该被视为一流的语言语义。但是lambda不支持move捕获。当然我知道使用move捕获代理有一些解决方法-但我想知道原因决定此功能不包含在C++11标准中,尽管它很重要. 最佳答案

c++ - 在通用 lambda 中使用 `if constexpr` 访问成员类型需要两个分支的格式都正确 - gcc 与 clang

考虑两个具有不同成员类型别名的struct:structfoo{usingx=int;};structbar{usingy=float;};在template上下文中给定一个T,我想获得T::x或T::y取决于T是什么:templateautos(){autol=[](autop){ifconstexpr(p){returntypenameT::x{};}else{returntypenameT::y{};}};returnl(std::is_same{});}intmain(){s();}g++编译上面的代码,而clang++产生这个错误:error:notypenamed'y'in