[可选](
参考当前草案)中提到的
std::optional<T>
类模板的类型参数的唯一要求是类型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
}