2016-10-17 4 views
0

std::optional는 방법을value_if - value_or의 반대 또는 std :: optional의 반대?

template< class U > constexpr T value_or(U&& default_value) const&; 

을 가지고 있으며, 아직 그 반대 일처럼 스며 생성자

template< class U > optional(bool condition, const U& value); 

이 없습니다.

constexpr std::optional<T> value_if(bool condition, const T& value) { 
    return condition ? nullopt : std::optional(value); 
} 

내 질문 :

  1. (I 나열된 변종 중 하나에서)를 value_if와 개념에 문제가 있습니다 또는 당신은 정적 방법 /라는 이름의 생성자 관용구가 기대?
  2. 표준에 제안 된 것과 비슷한 것이 었나요?

참고 : const T& value 또는 const T&& value 중 어느 것이 있는지 확실하지 않았습니다.

답변

2

(나열된 변형 중 하나에서) value_if에 개념적인 문제가 있습니까?

예. 조건이 nullopt 인 경우에도 실시간 T 개체를 만들어야합니다. auto t = cond ? optional<T>(expr) : nullopt; 인라인을 수행하는 경우 condtrue 인 경우에만 expr을 평가합니다. 예를 들어

은 :

auto optStr1 = value_if(cond, get_object(...)); //Will *always* evaluate get_object 
auto optStr2 = cond ? optional(get_object(...)) : nullopt; //Will only evaluate get_object if `cond` is true 

그 같은 표준에 들어갈 제안되었다

?

번호

+0

난 이해가 확실하지 않다. 참조로 전달하면 어떤 시점에서 라이브 T 객체가 생성됩니까? 즉, 'value_if'에 전달한 초기 인수가 있습니다.이 인수는 참조를 전달하는 기존 객체입니다. 그리고 3 진수 연산자의 세 번째 절에 구조가 있습니다. 그러나 짧은 순환 논리이므로 실제로 호출되지 않습니다. 또는 나는 무엇인가 놓치고 있냐? – einpoklum

+0

@einpoklum : 추가 예제를 참조하십시오. –

+0

아, 그게 정확히'my_optional.value_or (get_object (...)) '와 똑같은데,'auto v = my_optional? my_optional.value : v {}'; – einpoklum