Stati c поиск имени члена из generi c lambda в инициализаторе переменной-члена шаблона - ошибка компилятора? - PullRequest
3 голосов
/ 12 марта 2020

Следующий код компилируется на G CC и Clang, но не MSV C:

namespace ns {
    struct Foo {
        static void bar() { }

        template <int>
        static inline auto baz = [](auto) {
            bar();
        };
    };

    void(*qux)(int) = Foo::baz<42>;
}

MSV C выводит:

<source>(7): error C3861: 'bar': identifier not found
<source>(8): note: see reference to function template instantiation 'auto ns::<lambda_1339c3816c4e146ee6a49e0218a2a48b>::operator ()<_T>(_T) const' being compiled
        with
        [
            _T=int
        ]
<source>(8): note: see reference to function template instantiation 'auto ns::<lambda_1339c3816c4e146ee6a49e0218a2a48b>::<lambda_invoker_cdecl><_T>(_T)' being compiled
        with
        [
            _T=int
        ]
<source>(8): note: see reference to alias template instantiation 'ns::<lambda_1339c3816c4e146ee6a49e0218a2a48b>::<lambda_typedef_cdecl><int>' being compiled
<source>(8): note: while compiling class template member function 'ns::<lambda_1339c3816c4e146ee6a49e0218a2a48b>::operator unknown-type (__cdecl *)(_T1)(__cdecl *(void) noexcept const)(_T1)'

Любое из этих изменений «исправляет» ошибку:

  • Делает лямбду не универсальной c
  • Делает Foo::baz нетабличной переменной типа stati c
  • Создание Foo::baz статического c шаблона функции, который возвращает лямбду
  • Квалификацию вызова на bar как Foo::bar();
  • Удаление ns, добавление Foo и qux в глобальное пространство имен

Для меня это похоже на ошибку компилятора. Это один из них, или я наблюдаю какое-то неопределенное или определяемое реализацией поведение?

Живой пример с Godbolt

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