如果 R 既不可构造、不可复制、不可移动,我可以有一个 std::Optional<R> 吗?

问题描述 投票:0回答:1

[可选](

参考当前草案
)中提到的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
}

Godbolt 示例链接.

c++ c++17 stdoptional
1个回答
0
投票

我知道问题是,但显然你可以这样做:

auto o = std::optional<int>{0}.transform([](int){ return R::create(); });

不确定它是否有效或 UB。

© www.soinside.com 2019 - 2024. All rights reserved.