Каковы правила поиска при вызове функции из лямбды? - PullRequest
6 голосов
/ 02 сентября 2011

В следующем примере демонстрируется проблема, с которой я столкнулся в VC ++ 2010:

class Foo
{
    template<class T>
    static T foo(T t) { return t; }

public:
    void test()
    {
        auto lambda = []() { return foo(1); }; // call to Foo::foo<int>
        lambda();
    }
};

VC ++ выдает: ошибка C3861: 'foo': идентификатор не найден

Если я квалифицирую вызов foo: Foo::foo(1);, то этот пример компилируется с предупреждением: предупреждение C4573: использование 'Foo::foo' требует, чтобы компилятор захватил 'this', но текущий режим захвата по умолчанию не позволяет его

Что стандарт говорит об этом случае? Должно ли быть найдено безоговорочное имя? Требуется ли полное имя для захвата this?

Ответы [ 2 ]

4 голосов
/ 03 сентября 2011

Microsoft видела эту проблему в ряде случаев. См:

Разрешение области с лямбдами влияет на пространство имен и разрешение типа

Разрешение шаблона в лямбдах

Как вы узнали, явное разрешение позволяет ему найти имя. Есть дополнительное предупреждение об этом, которое также является ошибкой компилятора (разрешение имен не требует доступа к этому, хотя я могу видеть, как реализация компилятора может требовать этого) - это отдельная ошибка. Microsoft подтвердила, что это ошибка, и, очевидно, подготовила исправление для следующего выпуска.

2 голосов
/ 02 сентября 2011

Следующее компилируется нормально.Мне кажется, что это просто ошибка VS с шаблонами.

struct Foo {
    static void foo() {}
    void bar() {
        auto f = []() { foo(); };
        f();
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...