如何从函数返回std :: optional <myclass>?

时间:2017-11-24 20:41:20

标签: c++ optional c++17

我似乎错过了一些非常简单的事情。以下不起作用:

#include <optional>

class Alpha {
    Alpha() { }
    Alpha(const Alpha& that) { }
    Alpha(Alpha&& that) { }
    ~Alpha() { }

    static std::optional<Alpha> go() {
        return Alpha();
    }
};

我得到的错误是:

no suitable user-defined conversion from "Alpha" to "std::optional<Alpha>" exists 
T in optional<T> must satisfy the requirements of Destructible 
'return': cannot convert from 'Alpha' to 'std::optional<Alpha>'

我错过了什么,你可以解释一下原因吗?

1 个答案:

答案 0 :(得分:5)

您将所有构造函数设为私有。 std::optional无法移动或复制您的课程。要解决这个问题,只需执行此操作:

class Alpha {
public: // <--- there
    Alpha() { }
    Alpha(const Alpha& that) { }
    Alpha(Alpha&& that) { }
    ~Alpha() {}

private:
    static std::optional<Alpha> go() {
        return Alpha();
    }
};

您还可以使用struct,默认情况下这是一个包含公共成员的类。

另外,请记住,默认的构造函数和赋值运算符通常在你只是放空的那些地方更好,更高效。