나는 다음과 같은 코드는 컴파일 및 실행 (vc2012 & gcc4.7.2)비공개 형식으로 자동을 사용할 수있는 이유는 무엇입니까?
class Foo {
struct Bar { int i; };
public:
Bar Baz() { return Bar(); }
};
int main() {
Foo f;
// Foo::Bar b = f.Baz(); // error
auto b = f.Baz(); // ok
std::cout << b.i;
}
가이 코드는 잘 컴파일하는 것이 올바른지 어떻게 든 놀랐다? 그리고 그것이 왜 정확합니까? 개인 이름으로 auto
을 사용할 수 있습니까? (예상대로) 이름을 사용할 수없는 이유는 무엇입니까?
'표준이기 때문에'f.Baz() i'가도 OK 것을 관찰 :: cout << typeid (f.Baz()) .name()'. 클래스 외부의 코드는'Baz()'에 의해 반환 된 타입을 "볼 수"있습니다.이 타입을 붙잡을 수 있다면 이름을 붙일 수 없습니다. –
그리고 그게 이상하다고 생각하면 (당신이 그걸 물어 보는 것처럼 보일 수도 있습니다) 당신이 유일한 전략은 아닙니다;)이 전략은 [Safe-Bool Idiom] (http : // www .artima.com/cppsource/safebool.html). –
기억해야 할 것은 컴파일러가 도움을 줄 수있는 방식으로 API를 설명하는 편의를 위해 'private'이 있다는 것입니다. 'Foo' 사용자가'Bar' 타입에 접근하는 것을 막기위한 것이 아니기 때문에,'Bar'의 인스턴스를 돌려줌으로써'Foo'를 어떤 식 으로든 방해하지 않습니다. –