В стандарте сказано, что функция, впервые объявленная другом, имеет внешнюю компоновку. Что происходит, если я пишу
//cl.h
class A{
friend void fun();//так как по аргументам функцию не найти, то я ее могу
//теперь спрятать в какой-то единице трансляции, задав ей статическую
//компоновку
};
//some_cpp.cpp
#include “cl.h”
static void fun(){
///
}
Другом будет эта fun с внутренне компоновкой? А что произойдет, если я объявлю функцию не static, а в безымянном namespace?
LL>LL>//cl.h
LL>class A{
LL> friend void fun();//так как по аргументам функцию не найти, то я ее могу
LL>//теперь спрятать в какой-то единице трансляции, задав ей статическую
LL>//компоновку
LL>};
LL>//some_cpp.cpp
LL>#include “cl.h”
LL>static void fun(){
LL>///
LL>}
LL>
Я так понял, что это будет ошибкой из-за несоответствия компоновок. Но как же в случае с unnamed namespace? Объявление друга относится к функции, которая не в нем (глобальной)?
Здравствуйте, Lorenzo_LAMAS, Вы писали:
LL>В стандарте сказано, что функция, впервые объявленная другом, имеет внешнюю компоновку. Что происходит, если я пишу
LL>LL>//cl.h
LL>class A{
LL> friend void fun();//так как по аргументам функцию не найти, то я ее могу
LL>//теперь спрятать в какой-то единице трансляции, задав ей статическую
LL>//компоновку
LL>};
LL>//some_cpp.cpp
LL>#include “cl.h”
LL>static void fun(){
Это ошибка: одно и то же имя не может одновременно иметь internal и external linkage.
LL>///
LL>}
LL>
LL>Другом будет эта fun с внутренне компоновкой?
Нет. Код некорректен.
LL>А что произойдет, если я объявлю функцию не static, а в безымянном namespace?
Это будет просто функция в безымянном namespace.
А вот функция, объявленная в глобальном namespace и будет другом.
Руслан