this answer을 읽은 후, 나는 몇 가지 테스트를했고 나는 다음과 같은 코드를 내놓았다 : 내가 생각, main()
에친구 연산자 <<와 템플릿 클래스 멤버의 개인 액세스
#include <iostream>
template <typename T>
class Test {
int val{42};
friend std::ostream & operator << (std::ostream & flux, Test const & instance) {
return flux << Test<char>{}.val;
}
};
int main() {
std::cout << Test<int>{};
return 0;
}
Test<int>
를 사용하여 해당 operator<<
는 할 수 없었다 액세스 Test<char>{}.val
. 그러나 놀랍게도, GCC는 정상적으로 편집되었습니다.
그런 다음 Clang과 Visual Studio에서 테스트 한 결과, 둘 다 예상과 같이 개인 회원 오류가 발생했습니다 (GCC/Clang demo 참조).
올바른 컴파일러는 무엇입니까?
도 궁금합니다. extrovert 버전이 링크에 언급되어 있습니다. 또는 operator<<
의 에 대한 개인 액세스는 Test<T>
(T
! = U
일 때)입니까? 실용적인 예가 있습니까?
어떤 버전의 C++에 대해 묻고 있습니까? 그 컴파일러의 어떤 버전을 사용 했습니까? –
표준 (C++ 11)에서이 프로그램이 유효하다고 여겨지는 증거는 없지만 GCC가 그러한 명백한 오류로 보이는 것을 받아들이는 것은 의심 스럽습니다. –
아마도 누군가가 14.5.4/5 ... 11.3/2를 잘못 읽은 것 같아요. 내가 찾은 것이 무엇이든 모순되는 것은 아닙니다. 나는 당신이 GCC의 Bugzilla에이 글을 올리라고 제안하고, devs가 어떤 결론을 내렸는지를 알려주는 답변을 되돌려 준다. –