2017-09-14 10 views
1

표준 : 옵션을 사용하여 몇 가지 코드를 교체 할 때 내가 런타임 오류가 있었다 :왜 std :: optional :: value() &&; 돌아온다 &&?

오래된 코드 :

T getValue(); 
... 
const auto& value = getValue(); 
value.get(); 

새로운 코드 :

std::optional<T> getValue(); 
... 
const auto& value = getValue().value(); 
value.get(); // Runtime error, crash 

그것은 나를 위해 예측할 수 있었다. 충돌의 원인은 메서드가 T&&을 반환한다는 것입니다.

내 질문에 어떤 경우에 T&&이 유용 할 수 있습니다. 왜 메서드가 T을 반환하지 않습니다.

전체 코드 :

(rvalue-) 참조를 반환하는 것이 더 비용이없는 반면, 그것을 구성 이동 T 힘을 반환
#include <experimental/optional> 
#include <iostream> 
#include <memory> 

struct Value { 
    std::unique_ptr<int> a = std::make_unique<int>(5); 
}; 

std::experimental::optional<Value> getValue() { 
    Value v; 
    return v; 
} 

int main() { 
    const Value& value = getValue().value(); 
    std::cout << *value.a << std::endl; 
    return 0; 
} 
+5

[mcve] 또는 [SSCCE (Short, Self Contained, Correct Example)]로 귀하의 질문을 수정하십시오. http://sscce.org – NathanOliver

+0

[this] (https ://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope)는 아마도 참조를 반환하는 경우 적합합니다. – NathanOliver

+0

'/ * const */T &'BTW를 반환하면 비슷한 문제가 발생합니다. – Jarod42

답변

3

이것은 두 가지 경쟁적인 요구로 인한 사소한 디자인 결함입니다.

먼저 여분의 이동을 피하고 두 번째 활성화 참조 수명 연장.

이 두 가지는 현재 C++에서 경쟁합니다. 당신은 보통 한 번에 두 문제를 해결할 수 없습니다. 따라서 코드가 하나 또는 다른 것을 수행하는 것을 알게 될 것입니다.

개인적으로 곧 가치가있는 객체에서 이동하는 것보다 더 많은 문제를 생성하기 위해 rvalue 참조를 반환하지만 std::optional을 표준화 한 사람들은 동의하지 않습니다.

내 선호하는 솔루션에는 다른 단점이 있습니다.

이러한 문제를 해결할 필요가 없도록 수정하려면 수명 연장이 작동하는 방식을 복잡하게 지저분하게 다시 정의해야합니다. 그래서 우리는 지금이 문제들과 함께 살아야합니다.

1

.

는 다음

getOptional().value() 

여러 사본을 (그것이 (이동) 멤버를 반환으로 망막 정맥 폐쇄가 여기에 적용되지 않습니다) 할 것

std::optional<std::array<T, N>> getOptional(); 

을 가지고 있다고 가정하자.