C++ lambda表达式中的作用域 #包括“stdafx.h” #包括 使用名称空间std; 模板 结构X { void run()常量 {//这到底为什么不起作用? [&]() { 类型::alloc(); }; } void run_1()常量 {//如果是这样的话 类型::alloc(); } }; 结构T { 静态空穴alloc() {} }; int _tmain(int argc,_TCHAR*argv[] { X; x、 运行_1(); 返回0; }

C++ lambda表达式中的作用域 #包括“stdafx.h” #包括 使用名称空间std; 模板 结构X { void run()常量 {//这到底为什么不起作用? [&]() { 类型::alloc(); }; } void run_1()常量 {//如果是这样的话 类型::alloc(); } }; 结构T { 静态空穴alloc() {} }; int _tmain(int argc,_TCHAR*argv[] { X; x、 运行_1(); 返回0; },c++,lambda,c++11,C++,Lambda,C++11,AFAIC lambda是一个未命名的fnc,所以如果这是真的,为什么run不编译而run_1编译? 使用VS2010 sp beta1。您必须调用lambda。它是一个函子,所以在它的末尾需要一个()来有效地调用lambda 我似乎误解了这个问题。对不起 但是已经有一个类似的帖子在上面了 这里有另一个链接,也提到了同样的问题,引用了《标准》中关于这个问题的一段话。 您必须将其传递给lambda: /* Code does NOT answer question above... void r

AFAIC lambda是一个未命名的fnc,所以如果这是真的,为什么run不编译而run_1编译?
使用VS2010 sp beta1。

您必须调用lambda。它是一个函子,所以在它的末尾需要一个()来有效地调用lambda

我似乎误解了这个问题。对不起


但是已经有一个类似的帖子在上面了

这里有另一个链接,也提到了同样的问题,引用了《标准》中关于这个问题的一段话。

您必须将其传递给lambda:

/* Code does NOT answer question above...
void run()const
    {//Why on earth this doesn't work?
        [&]()
        {
            Type::alloc();
        }(); //very important parenthesis if you wish to call the lambda
    }*/

我不得不承认我不太确定,但我认为这只是VS2010的一个限制,它应该可以在C++0x(cf.)中很好地编译。我认为你所看到的机制如下:


定义模板时,模板参数定义的类型在某些方面不是“完全成熟”的类型名。一个例子说明了这一点,虽然有人可能希望
X::Type
(使用示例中的X)返回Foo,但它没有返回Foo。

@RedX在发布之前是否检查了答案?您使用的编译器是什么?它是否支持C++0x?这不能解释它为什么不编译。只有C++0x支持lambda。。。如果没有这一点,编译器将无法理解语法?@这里有一个类似的问题,也许这有助于我的猜测,无论您以何种方式切割它,lambda函数都不是X的成员,即使它是在
run()
中声明的。它与封闭类无关。请告诉我们VS2010返回的编译错误。它是
错误C2653:'Type':不是类或命名空间名称
可能与@Moo Juice的可能重复项重复,所以“它们”不是真的关于Lambda,Lambda与fnc相同,唯一的例外是没有名字?我真的很喜欢fnc正文的第一行。谢谢至于兰博达斯呢?失望。您只能在最简单的情况下使用它们,但需要更高级使用的用户必须使用“命名”FNC。失望。谢谢你的回答。@Moo Juice在我的“真实示例”中,它实际上并不起作用。原因?类型中的alloc已重载。@在这里,您能将其中一些(或示例代码)粘贴到问题的末尾,让我了解一下吗?@Moo Juice行太多,标题太多。实现是一个单独的头Alloc是来自不同头的typedef,memoryManager也在不同头中。但是你可以尝试一下,如果你真的想检查它,让alloc重载,你应该得到与我“相同”的结果。@在这里,我假设你得到的错误是
错误C3535:无法从“重载函数”推断“auto”的类型。
/* Code does NOT answer question above...
void run()const
    {//Why on earth this doesn't work?
        [&]()
        {
            Type::alloc();
        }(); //very important parenthesis if you wish to call the lambda
    }*/
    void run()const
    {//Why on earth this doesn't work?
        auto alloc = Type::alloc;
        [&]()
        {
            alloc();
        };
    }