这段代码对于熟悉JS的开发者来说并不陌生。
function get_counter()
{
return (
function() {
var c = 0;
return function() { return ++c; };
})();
}
它基本上创建了一个创建不同枚举器的<template>
。所以我想知道是否可以使用新的lambda语义在C++11中完成相同的事情?最终我编写了这段C++代码,但不幸的是它不能编译!
int main()
{
int c;
auto a = [](){
int c = 0;
return [&](){
cout << c++;
};
};
return 0;
}
我在想是否有一种解决方法可以将其编译,并且如果有的话,编译器如何使此代码正确运行?我的意思是它必须创建单独的枚举器,但还应该收集垃圾(未使用的变量)。
顺便说一下,我正在使用VS2012编译器,它会生成此错误:
Error 2 error C2440: 'return' : cannot convert from 'main::<lambda_10d109c73135f5c106ecbfa8ff6f4b6b>::()::<lambda_019decbc8d6cd29488ffec96883efe2a>' to 'void (__cdecl *)(void)' c:\users\ali\documents\visual studio 2012\projects\test\test\main.cpp 25 1 Test
a
时,它都会返回一个新的lambda对象。你需要将a
的返回值赋给某个变量 -- 当该变量被销毁时,lambda所使用的捕获变量的资源也会随之销毁。 - Steve Jessopreturn expr;
的主体来进行返回类型推断,但您没有它。如果没有来自C++11后期的扩展返回类型推断规则,此代码无论如何都不应编译。如果VS2012有这些规则,我会感到惊讶。 - Xeo