다음 코드가 컴파일되어 실행된다는 것에 어떻게 든 놀랐습니다 (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
개인 유형으로 사용할 수 있는데 예상대로 이름을 사용할 수없는 이유는 무엇 입니까?
그리고 그것이 이상하다고 생각한다면 (아마도 당신이 그것에 대해 묻는 것처럼) 당신은 유일한 것이 아닙니다.)이 전략은 Safe-Bool Idiom 과 같은 것들에 유용합니다 .
—
Matthieu M.
기억해야 할 것은
—
Steve Jessop
private
컴파일러가 적용 할 수있는 방식으로 API를 설명 할 수있는 편의성이 있다는 것입니다. 의 Bar
사용자가 유형 에 액세스하는 것을 방지하기위한 Foo
것이 아니므 Foo
로의 인스턴스를 반환하여 해당 액세스를 제공하는 데 방해가되지 않습니다 Bar
.
"이 코드가 제대로 컴파일되는 것이 맞습니까?" 아닙니다
—
LF
#include <iostream>
. ;-)
f.Baz().i
그대로 확인 하십시오std::cout << typeid(f.Baz()).name()
. 클래스 외부의 코드는 반환Baz()
할 수 있는 유형을 "볼" 수 있으며 이름을 붙일 수는 없습니다.