2017-03-17 8 views
0

이 경우 어떻게됩니까?'const auto'에 rvalue를 할당하면 어떻게됩니까

// assume WeakPtr is valid and has not expired 
const auto& something = WeakPtr.lock(); 
something->doStuff(); 

이것은 정의되지 않았습니까?

이 시나리오에서 변경 되나요?

어때요? 이 경우 const auto& 각에서

std::vector<int> getInts() { return std::vector<int>{ 1, 2, 3 }; } 
const auto& ints = getInts(); 

내가 개체에 대한 참조를 바인딩 할, 그러나 각각의 경우에 나는 임시를 rvalue 객체에 바인딩하고 있음을 의미한다. 재앙을 초대할까요?

+0

다음과 같이 질문이 번뜩입니다. http://stackoverflow.com/questions/42868517/why-can-you-intialize-a-const-reference-but-not-a-non-const-reference -from-an-rv 왜곡과 wherefores에 대한 유용한 해설. – user4581301

+0

"임시"와 "rvalue"의 차이점을 알아 두는 것이 중요합니다. 후자는 엄격히 일반적입니다. 예를 들어'const int & r = 5;'와'const int & q = std :: move (5); '를 비교하자. 둘 다 rvalues, 하나는 재앙입니다. –

답변

1

이것은 정의되지 않았습니까?

각각의 경우는 잘 정의되어 있습니다.

이 경우 어떻게됩니까?

임시 객체의 수명은 표준의 [class.temporary] 섹션에 설명 된 것처럼 const 참조의 수명과 일치하도록 확장됩니다.

[class.temporary (표준 초안)

임시직 4는 풀 식의 단부가 아닌 다른 지점에서 파괴하는 두 가지 상황이있다. 첫 번째 상황은 ... [사례와 관련 없음]

5 두 번째 컨텍스트는 참조가 임시로 바인딩되는 경우입니다. 참조가 인 임시 또는 참조가 바인딩되는 하위 객체의 전체 객체 인 임시는 참조의 수명 동안 을 유지합니다. [예외가있는 몇 가지 예외 사항]

+0

_ "각 경우는 잘 정의되어 있습니다."_ 음, 아니요, WeakPtr.lock()과 mSomething.lock()이 리턴하는 것과 달려 있습니다. 마지막 경우는 유일하게 확실하게 정의 된 경우입니다. –

+0

기본적으로 로컬에 대한 참조가 반환되지 않으므로 잘 정의되어 있습니다. 원래. –

+0

@BoundaryImposition이 함수는 함수에서 임시 객체 인 rvalue를 반환 할 때 잘 정의되어 있지 않습니다. 참조 (로컬 또는 기타)는 lvalue입니다. – user2079303