2011-01-16 5 views
3

에 액세스 지정자 주위 방법 다음 코드를 고려하십시오.는 C + +0의 decltype

하지만 지금 g의 반환 값을 지정할 수 decltype를 사용한다고 가정은 잘 컴파일

class A 
{ 
private: 
    class B {}; 
public: 
    B f(); 
}; 

A a; 

decltype(a.f()) g() 
{ 
    return a.f(); 
} 

갑자기 (g ++> = 4.4).

그래서 기본적으로 decltype을 사용하여 C++ 98에서 할 수 없었던 방식으로 액세스 지정자를 사용합니다.

의도적입니까? 이 좋은 습관인가?

+1

관련 : [개인 부분으로 위임] (http://stackoverflow.com/questions/2952216/) – fredoverflow

답변

5

액세스는 (및 경우에 따라 생성자/소멸자) 이름에만 적용됩니다. 엔티티 자체에는 적용되지 않습니다. 사양은 더 자세히 설명합니다

[참고 : 액세스 제어가 이름에 적용되므로 액세스 제어가 typedef 이름에 적용되면 typedef 이름의 액세스 가능성 만 고려됩니다. typedef에 의해 참조 된 엔터티의 액세스 가능성은 고려되지 않습니다. 예를 들어,

class A { 
    class B { }; 
public: 
    typedef B BB; 
}; 

void f() { 
    A::BB x; // OK, typedef name A::BB is public 
    A::B y; // access error, A::B is private 
} 

용 - 엔드 노트]

그래서 당신이 여기 disovered 한 것은 놀라운 일이 아니다. C++ 03에서도 f의 주소를 가지고 &A::f이라고 말하고 반환 유형을 추론하는 함수 템플릿에 전달하면 A::B 유형을 확보 할 수 있습니다.