Область в лямбда-выражении - PullRequest
3 голосов
/ 17 января 2011
#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 ]

2 голосов
/ 17 января 2011

Вам придется передать его в лямбду:

    void run()const
    {//Why on earth this doesn't work?
        auto alloc = Type::alloc;
        [&]()
        {
            alloc();
        };
    }
2 голосов
/ 17 января 2011

Я должен признать, что я не совсем уверен, но я думаю, что это только ограничение VS 2010, и он должен хорошо компилироваться в C ++ 0x (см. шаблоны, имя типа, лямбда -> зависимые имена не зависимо? * +1002 *). Я думаю, что механика того, что вы видите, выглядит следующим образом:

При определении шаблона типы, определяемые параметрами шаблона, в некоторых аспектах не являются «полноценными» типами имен. Одним из примеров, демонстрирующих это, является то, что, хотя кто-то может ожидать, что X<Foo>::Type (с X из вашего примера) вернет Foo, это не так.

1 голос
/ 17 января 2011

Вы должны позвонить в лямбду. Это функтор, поэтому вам нужен () в конце для эффективного вызова лямбды.

/* 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 Тип шаблона не "виден" компилятором внутри лямбды

А вот еще одна ссылка, относящаяся к той же проблеме, с цитатой из стандарта по этому поводу. шаблоны, typename, lambda -> зависимые имена не зависят?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...