lambda表达式中的范围

时间:2011-01-17 10:07:40

标签: c++ lambda c++11

#include "stdafx.h"
#include <iostream>
using namespace std;

template<class Type>
struct X
{
    void run()const
    {//Why on earth this doesn't work?
        [&]()
        {
            Type::alloc();
        };
    }
    void run_1()const
    {//if this does
        Type::alloc();
    }
};

struct T
{

    static void alloc()
    {}
};


int _tmain(int argc, _TCHAR* argv[])
{
    X<T> x;
    x.run_1();
    return 0;
}

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

3 个答案:

答案 0 :(得分:2)

你必须将它传递给lambda:

    void run()const
    {//Why on earth this doesn't work?
        auto alloc = Type::alloc;
        [&]()
        {
            alloc();
        };
    }

答案 1 :(得分:2)

我不得不承认我不太确定,但我认为这只是VS 2010的限制,它应该在C ++ 0x中编译得很好(参见templates, typename, lambda -> dependent names not dependent?)。我认为你所看到的机制如下:

在定义模板时,模板参数定义的类型在某些方面不是“完全成熟”的类型名称。证明这一点的一个例子是,虽然某人可能期望X<Foo>::Type(使用您的示例中的X)返回Foo,但事实并非如此。

答案 2 :(得分:1)

你必须调用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
    }*/

我似乎误解了这个问题。遗憾。


但是在SO Template type is not "seen" by the compiler inside a lambda

上已经有类似的帖子了

这是另一个引用相同问题的链接,引用了关于此的标准。 templates, typename, lambda -> dependent names not dependent?