2016-10-17 3 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. Существует ли концептуальная проблема с value_if (в любом из вариантов, которые я перечислил)?
  2. Было что-то вроде предлагаемого, чтобы пойти в стандарт?

Примечание: Я не был уверен, иметь ли const T& value или const T&& value.

ответ

2

Есть ли концептуальная проблема с value_if (в любом из перечисленных вариантов)?

Да. Для этого требуется создать объект T, даже если ваше состояние создает nullopt. Принимая во внимание, что auto t = cond ? optional<T>(expr) : nullopt; inline будет оценивать только expr, если cond is true.

Например:

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 

Было что-то подобное, что предложил пойти в стандарт?

No.

+0

Я не уверен, я понимаю. В какой момент будет создан живой объект T, если я пройду по ссылке? Я имею в виду, что есть начальный аргумент, который я передаю 'value_if', который является существующим объектом, с которым я передаю ссылку; и есть конструкция в третьем предложении оператора trinary - но это короткозамкнутая логика, так что на самом деле ее не вызывали. Или я чего-то не хватает? – einpoklum

+0

@einpoklum: см. Добавленные примеры. –

+0

Ах, но это точно так же, как 'my_optional.value_or (get_object (...))', который можно заменить на 'auto v = my_optional? my_optional.value: v {} '; – einpoklum

Смежные вопросы