value_if - std :: optional的value_or的反转?

时间:2016-10-17 11:54:59

标签: semantics optional c++17 algebraic-data-types

std::optional有方法

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

然而,它没有构造函数

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

与其他东西相似。或者,您可能希望它具有静态方法/命名构造函数idiom:

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

我的问题:

  1. value_if是否存在概念性问题(我列出的任何一种变体)?
  2. 是否有类似的建议进入标准?
  3. 注意:我不确定是const T& value还是const T&& value

1 个答案:

答案 0 :(得分:2)

  

是否存在value_if的概念问题(在我列出的任何一种变体中)?

是。它要求您创建实时T对象,即使您的条件正在创建nullopt。如果auto t = cond ? optional<T>(expr) : nullopt;expr,则cond内联只会评估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
  

是否有类似的建议进入标准?

没有