다음 코드는 (적어도 GCC의 최신 버전에 대한) 컴파일 오류가 발생합니다 :친구 선언에서 정규화 된 이름을 사용하기위한 규칙은 무엇입니까?
이namespace a {
class X { friend void ::foo(); };
}
오류는 다음과 같습니다
'void foo()' should have been declared inside '::'
우리가 표준에 따라, 선언에서 ::
을 제거하는 경우 , foo
은 (표시되지는 않지만) 네임 스페이스 a
에 도입됩니다. foo 내부에있는 foo는 a
일 필요는 없습니다.
내 질문에 위와 같이 전역 네임 스페이스 내에서 미리 선언해야하는 이유는 무엇입니까? foo
이라는 이름이 글로벌 네임 스페이스의 구성원이되지 않는 이유는 무엇입니까? 표준에서 명시 적으로 금지하는 단락을 찾을 수 없으므로 궁금합니다.