У меня есть следующий фрагмент кода C ++. Объявлен класс внутри main()
функция.
По какой причине мы не можем определить функцию друга в локальном классе?
#include<iostream>
int main()
{
class Foo
{
void foo() {} // Ok
friend void Bar(){}; // Error
};
}
Есть практическая причина. Прежде всего, встроенное определение друга не может быть найдено ни квалифицированным, ни неквалифицированным поиском. Это может только найти по ADL. Поэтому, если мы возьмем класс из вашего примера, поместите его в глобальную область видимости и попытайтесь вызвать Bar
:
class Foo
{
friend void Bar(){};
void foo() {
Bar();
}
};
Мы будем уведомлены о том, что Bar
не был объявлен в этой области. Так что, если это было в местном классе. Вы не можете назвать это от участников. Вы не можете вызвать это внутри функции. Единственный способ, которым вы может вызов включает в себя либо некоторые обручи или ADL. Так что язык просто не позволяет этого. Это не считается полезной функцией.
Поскольку функции-члены локального класса должны быть определены полностью внутри тела класса, а функция-друг не является функцией-членом. Мы объявили дружественные функции внутри класса и определены вне класса.
В соответствии с cppreference:
Местные классы
- Локальный класс не может иметь статических членов
- Функции-члены локального класса не имеют связи
- Функции-члены локального класса должны быть определены полностью внутри тела класса
- Локальные классы, кроме типов замыкания (начиная с C ++ 14), не могут иметь шаблонов элементов
- У локальных классов не может быть шаблонов друзей
- Локальные классы не могут определять дружественные функции внутри определения класса
- Локальный класс внутри функции (включая функцию-член) может обращаться к тем же именам, к которым имеет доступ включающая функция.