2015-02-02 3 views
0

C++의 함수 반환 유형에 대한 질문이 있습니다.C++에서 함수의 익명 인스턴스/값 반환

return pair<int, int>(1, 1);return vector<int>(3, 3);이 작동합니까? return int 1;이 작동하지 않기 때문에 반환 값처럼 반환 값으로 가져 오기 전에 로컬 인스턴스 var를 생성해서는 안된다.

// ... 

int fun1() { 
    // return int 1; 
    int a = 1; 
    return a; 
} 

pair<int, int> fun2() { 
    return pair<int, int>(1, 1); 
} 

vector<int> fun3() { 
    return vector<int>(3, 3); 
} 

int main(){ 
    cout << fun1() << endl; 
    cout << fun2().first << endl; 
    cout << fun3()[1] << endl; 

    return 0; 
} 

반환하는 스타일은 특정 생성자가있는 클래스 인스턴스에만 적용 할 수 있습니까? 아래 예제는 작동 할 수 있습니다. 확인 또는 참조 자료를 찾고 있습니다.

애플 LLVM 버전 6.0 (그 소리-600.0.56) (LLVM의 3.5svn 기준) 대상 :

class A { 
public: 
    int a; 
    A(int a_) : a(a_) {}; 
}; 

A fun4() { 
    return A(1); 
} 

코드 샘플은 테스트 x86_64에-사과 darwin14.0.0에게 스레드 모델을 : POSIX

답변

3

return int 1 때문에 작동하지 않습니다.

그러나 return int(1); ... 또는 return 3 - 2;입니다. 임시 또는 리터럴을 만드는 데 아무 문제가 없습니다. 호출자의 컨텍스트에서 변수를 설정하는 데 클래스 복사 또는 이동 생성자를 사용하거나 가끔 RVO (Return Value Optimization)를 호출하고 호출 된 함수는 호출자의 스택에 직접 반환 값을 만들 수 있어야합니다.

+0

나는 이동 생성자와 RVO를 가져 오는 것이 혼란을 야기하고 어떤 것도 명확하게 밝히지 않을뿐입니다. –

+1

@JonathanWakely : 반대 의견에는 사람들이'std :: cout << "복사를 \ n"; "하고 복사 생성자에 무수한 질문이있어서 가치로 돌아올 때 왜 사용되지 않는지 궁금합니다. "네가 그렇게한다면 저주받을거야, 그렇지 않으면 저주받을거야"라고 상황 IMHO. –