Следующий код компилируется на 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