2014-02-17 3 views
-3

는 상상 :이 함수는 어떤 종류의 객체를 반환합니까? 이 같은 상황을 가지고

class className{ 
... 
} 

className func(){ 
    className cl; 
    ... 
    return cl;  
} 

int main(){ 
    ... 
    func(); 
} 

이 프로그램의 본문에 호출 기능 func() 수익을 무엇? 객체의 임시 사본 cl? 함수 func()의 본문에서는 &cl이라는 주소를 얻을 수 있지만 main() 함수 내에서 &(func())을 호출하려고하면 오류가 발생하므로 이해가되지 않습니다.

+1

방법은 무한. 너 정말로 무엇을하려고하는거야? – Shoe

+0

이런 유형의 것들을 알아 내는데 유용 할 수있는 한 가지 방법은'className'의 생성자와 복사 생성자를 "cout"으로 정의하는 것입니다. 함수에 "cout'을 몇 개 추가하면 cl이 생성되고 복사 된 위치를 명확하게 볼 수있어 main으로 돌아갈 수 있습니다. – Matt

+0

'className cx = foo();'는 아마 더 이해하기 쉬울 것입니다. 그리고'& (func()) '로 시도한 것은 전혀 이해가되지 않습니다. – WhozCraig

답변

1

함수 내에서 함수는 소위 lvalue를 객체가 명시 적으로 말하면서 그 객체가 명시 적으로 정의되기 때문에 알려진 주소를 처리합니다. 함수의 반환 값은 임시 객체입니다 (이 값은 소위 rvalue입니다). 그 주소는 알려져 있지 않습니다. 우리는 컴파일러가이 객체를 정의한 을 모른다. 따라서 임시 객체에 연산자 &을 적용하지 못할 수 있습니다. 컴파일러 최적화의이 코드는 예를 MS VC++ 2010 버그의 언어 확장 중 하나 때문에 컴파일 것이기 불구하고 컴파일 할 수 없다

struct A 
{ 
    int x; 
}; 

A f() { return A(); } 

int main() 
{ 
    f().x = 10; // here the compiler will issue an error 
} 

또 다른 유사한 예. :)

+0

감사합니다. 나는 lvalues와 rvalues에 대해 몰랐다. 이제이 물건의 철학을 이해했습니다. – David

관련 문제