Почему MSVC Class 'Class' не Find Friend Function через ADL, предпочитая звонить Lambda?C++

Программы на C++. Форум разработчиков
Anonymous
Почему MSVC Class 'Class' не Find Friend Function через ADL, предпочитая звонить Lambda?

Сообщение Anonymous »

Файл CPP и два заголовка в конечном итоге образовали эту «проблемную» блок перевода: ² < /p>

Код: Выделить всё

namespace na {
struct Foo {
friend int getFoo(Foo const&, int const&) {
return 1;
}
};
inline constexpr auto makeFoo = [](auto const& sys) {
return [sys]{
return getFoo(sys, 0);
};
};
}

constexpr auto getFoo = [](auto const&) { return 1; };

namespace nc {
int bar() {
return na::makeFoo(na::Foo{})();
}
}
Проблемный находится в кавычках, потому что, хотя MSVC отказывается от него, GCC и Clang, кажется, в порядке с этим кодом, и я хотел бы понять, какой компилятор правильно. Foo ; Кроме того, это не противоречит объекту лямбда getfoo , потому что они не в одном и том же пространстве имен. />
(¹) Действительно, этого достаточно, чтобы переместить эту лямбду внутри пространства имен na {< /code>, и мы получаем ожидаемое переопределение 'getfoo' как различный вид символа < /code> на всех трех компиляторах. Удаление этого решает проблему.
Другое решение было бы (и, возможно, это все еще хорошая идея) сделать это Makefoo не общая лямбда, изменяя Auto на Foo , таким образом, вынуждая поиск для getfoo .>

Подробнее здесь: https://stackoverflow.com/questions/795 ... ng-a-lambd

Вернуться в «C++»