почему объявление друга для лямбда-выражения не работает в gcc

#c #lambda

#c #лямбда

Вопрос:

Смотрите этот простой пример,

 constexpr auto f = [](const autoamp; foo){
    foo.fun2();
};

struct Foo{
    friend decltype(f);

    void fun1() const{
        f(*this);
    }

    private:
    void fun2() const{}
};

int main(){
    Foo foo{};
    foo.fun1();
}
  

объявление друга, похоже, не работает. gcc жалуется, что fun2 является закрытым, даже если f ему предоставлен доступ.

это приводит к ошибке компилятора

 <source>: In instantiation of '<lambda(const auto:1amp;)> [with auto:1 = Foo]':

<source>:9:16:   required from here

<source>:2:13: error: 'void Foo::fun2() const' is private within this context

    2 |     foo.fun2();

      |     ~~~~~~~~^~

<source>:13:10: note: declared private here

   13 |     void fun2() const{}
  

godbolt

Комментарии:

1. Это должно работать? Если это так, аккуратно.

2. Похоже на ошибку. с clang все в порядке.

3. MSVC также не жалуется.

4. Этот лямбда на самом деле не лямбда, а шаблон. Это то, что, вероятно, смущает gcc.

5. Сообщение об ошибке GCC: gcc.gnu.org/bugzilla/show_bug.cgi?id=102791