当T不可构造、拷贝、移动仅可析构时,能否使用std::optional<T>?
std::optional与不可移动不可拷贝类型的使用疑问
根据C++标准[optional.optional.general] p3的规定,std::optional<T>类模板对类型参数T的唯一要求是T需满足Destructible(可析构)。
假设有如下满足该要求的严格限制类:
struct R { R(const R&) = delete; R& operator=(const R&) = delete; R(R&&) = delete; R& operator=(R&&) = delete; // 得益于C++17的保证拷贝消除,此函数可正常工作 static R create() { return R(); } private: R() = default; };
该类仍可正常使用:
void test_1() { R obj = R::create(); /* 使用obj */ }
问题核心:**我们能否拥有一个可用的std::optional
以下代码显然无法运行,因为R的所有构造函数均不可访问:
void test_2() { std::optional<R> o(R::create()); // 错误:无匹配构造函数 }
编辑补充:
如果std::optional能提供一个接受构建器(builder)的构造函数会不会更好?
template <typename Builder> optional::optional(disabmiguating_tag, Builder f) : my_internal_union(f()) { }
当然,my_internal_union也需要有对应的构造函数...
内容的提问来源于stack exchange,提问作者Igor G
相关产品推荐
相关产品推荐

