Пытаясь подружиться 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"
, а не без него?Как насчет изменений правил поиска имен, которые делают это необходимым?
Я в тупике.Наверное, есть какое-то правило, которое я не могу найти.