为什么 std::optional::value_or 没有默认 ctor 类型的专用化?
Why std::optional::value_or dont have a specialization for default ctor types?
std::optional<Class> a;
a.value_or( Class() ).GetMember();
为什么我们不能这样做:
a.value_or().GetMember();
标准是否可以在默认可构造的基础上专门化value_or
?
不幸的是,这个value_or
没有这个选项,我同意Max Langhof的评论,它应该是一个单独的函数value_or_default
。
然而,正如 Eljay 在此评论中指出的那样,问题中的代码可能会给具有昂贵默认构造的类带来问题。在optional
不携带值的情况下,我们不希望调用默认构造函数。
我已经为这种特定情况整理了一些解决方法:
struct default_constructor_t {
explicit default_constructor_t() = default;
};
inline constexpr default_constructor_t default_constructor{};
class Class {
...
Class(default_constructor_t) : Class{} {}
...
};
int GetMember(std::optional<Class> Object) {
return Object.value_or(default_constructor).GetMember();
}
在此解决方案中,您需要向类添加额外的隐式构造函数。这个解决方案也很懒惰。仅当默认构造函数没有值时,它才会调用optional
构造函数。
上发:经过一番思考,我相信我想出了一个更通用的解决方案,即使开发人员无法修改的类型也可以使用。即使一个人有这种能力,代码越少越好,对吧?
struct DefaultConstructed {
template <class T> operator T() const {
return T();
}
};
constexpr DefaultConstructed Default;
class Class {
...
};
int GetMember(std::optional<Class> Object) {
return Object.value_or(Default).GetMember();
}
此解决方案使用转换运算符而不是隐式构造。名为Default
的特殊对象可以通过调用此类型的默认构造函数(可以说(转换为任何类型的。它还保留了原始解决方案的良好属性,即懒惰。
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么 std::optional::value_or 没有默认 ctor 类型的专用化?
- 为什么在 ctor 的参数列表中将成员"x"的类型替换为"decltype(x)"会破坏类模板参数推导?
- 模板 ctor 类型推导不起作用(没有匹配的构造函数用于初始化 ...)与函数<>参数
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 如果每个参数都可以转换为特定类型,则启用 ctor
- C++错误 C2533,ctor :构造函数不允许返回类型
- 当使用类型为"类&&"的变量作为参数时,为什么调用复制 ctor 而不是移动 ctor
- 使用大括号初始化列表或传统的 ctor 语法实例化类型
- 返回带有已删除移动/复制 ctor 的类型临时
- c++ 11: bind std::sort用于用户定义的类型,然后使用该绑定作为ctor的参数
- 为什么"std::p air"将"std::tuple"作为ctor参数类型而不是"const std::tuple&"?
- 为什么分配器类型作为模板参数而不是 ctor 的参数?
- 指针类型的CTOR需要显式吗?
- 为什么VS2010向导在ctor和dtor中添加void类型