struct A {
A(int) : i(new int(783)) {
std::cout << "a ctor" << std::endl;
}
A(const A& other) : i(new int(*(other.i))) {
std::cout << "a copy ctor" << std::endl;
}
~A() {
std::cout << "a dtor" << std::endl;
delete i;
}
void get() {
std::cout << *i << std::endl;
}
private:
int* i;
};
const A& foo() {
return A(32);
}
const A& foo_2() {
return 6;
}
int main()
{
A a = foo();
a.get();
}
로컬 값에 대한 참조를 반환하는 것이 좋습니다. 그러나 다른 한편으로, const 참조는 임시 객체 수명을 연장해야합니다.const 참조를 로컬 객체로 반환 할 때 정확히 무엇이 발생합니까?
이 코드는 UB 출력을 생성합니다. 그래서 인생 연장은 없습니다.
왜? 누군가가 단계적으로 일어나는 일을 설명 할 수 있습니까?
내 추론 연쇄에 결함이 있습니까?
foo는()
A (32) -의 ctor
복귀 A (32) - 로컬 객체에 const를 참조하여 생성되며
A A를 반환 = foo(); - a는 foo() 반환 값으로 초기화되고, 반환 값은 범위를 벗어나 (표현에서 벗어남) 파기되지만 a는 이미 초기화되었습니다.
(그러나 실제로 소멸자는 복사 생성자 전에 호출됩니다)
FOO_2() :
반환 6 - A 형의 임시 객체는이 객체에, 암시 적으로 const를 참조를 생성 창조되고 (생명 연장) 돌려 보내진다.
A = foo(); - a는 foo() 반환 값으로 초기화되고, 반환 값은 범위를 벗어나 (표현에서 벗어남) 파기되지만 a는 이미 초기화되었습니다. 각각의 특정 상황에 맞는 임시 수명 연장의
(그러나 실제로 소멸자가 복사 생성자 전에 호출됩니다)
"const 참조는 임시 객체 수명을 연장해야합니다."<- erm, 아니요. object-lifetime이 아닌 const 및 const 참조가 동일하고 확장하지 않습니다 * 확장하지 않습니다. – Giel
알렉산더가 평생 동안 연장 할 수 있다고 생각하는 것 같습니다 : http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-most-important-const/ – vmpstr
@Giel : No. Const reference ** **는 임시 객체의 수명을 연장 할 수 있습니다. const와 non-const 참조는 임시 변수로 작업 할 때 상당히 다릅니다. 이 경우에는 OP가 기대하는 것과 다르게 작동합니다. – AnT