Попытка создать друзей class
с помощью функции extern "C"
, этот код работает:
#include <iostream>
extern "C" {
void foo();
}
namespace {
struct bar {
// without :: this refuses to compile
friend void ::foo();
bar() : v(666) {}
private:
int v;
} inst;
}
int main() {
foo();
}
extern "C" {
void foo() {
std::cout << inst.v << std::endl;
}
}
Но я был очень удивлен, обнаружив, что с g++ 4.6.1 и 4.4.4 я должен явно писать ::
в friend void ::foo();
, иначе дружба не сработает. Этот ::
нужен только тогда, когда он extern "C"
.
- Является ли это ошибкой/проблемой компилятора? Я не ожидал такого поведения.
- Если это не ошибка, почему это требуется, но только когда она
extern "C"
и не без нее? Как насчет изменений правил поиска имен, которые делают это необходимым?
Я в тупике. Вероятно, для этого есть правило, которое я не могу найти.