[optional.optional.general] p3std::optional<T>
中提到的类模板的类型参数的唯一要求是类型为Destructible。T
假设我有一个非常严格的课程,可以满足以下要求:
class R
{
public:
~R() = default;
// This works thanks to guaranteed copy elision since C++17.
static R create()
{
return R();
}
void do_something()
{
}
private:
R() = default;
R(const R&) = delete;
R& operator=(const R&) = delete;
R(R&&) = delete;
R& operator=(R&&) = delete;
};
但该类仍然可以完全使用:
void test_1()
{
R obj = R::create();
obj.do_something();
}
问题是:我真的能拥有一个可用的类型对象std::optional<R>
吗?“可用”是指包含值的对象。如果是,那么我该如何在其中构造该值?
下面的代码显然会失败,因为的每个构造函数都R
无法访问:
void test_2()
{
std::optional<R> o(R::create()); // Error: no matching constructor
}
编辑:
std::optional
如果有一个接受构建器的构造函数那不是很好吗?
template <typename Builder>
optional::optional(disabmiguating_tag, Builder f)
: my_internal_union(f())
{
}
my_internal_union
当然,使用适当的构造函数......