You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:37:10