Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何返回std::可选<;myclass>;从一个函数?_C++_Optional_C++17 - Fatal编程技术网

C++ 如何返回std::可选<;myclass>;从一个函数?

C++ 如何返回std::可选<;myclass>;从一个函数?,c++,optional,c++17,C++,Optional,C++17,我似乎遗漏了一些非常简单的东西。以下操作不起作用: #include <optional> class Alpha { Alpha() { } Alpha(const Alpha& that) { } Alpha(Alpha&& that) { } ~Alpha() { } static std::optional<Alpha> go() { return Alpha(); } }

我似乎遗漏了一些非常简单的东西。以下操作不起作用:

#include <optional>

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

    static std::optional<Alpha> go() {
        return Alpha();
    }
};
#包括
阿尔法类{
α(){}
Alpha(constalpha&that){}
Alpha(Alpha&&that){}
~Alpha(){}
静态std::可选go(){
返回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>'
不存在从“Alpha”到“std::optional”的合适的用户定义转换
可选的T必须满足可破坏性的要求
“return”:无法从“Alpha”转换为“std::optional”

我遗漏了什么,你能解释一下原因吗?

你把所有构造函数都设置为私有。
std::optional
无法移动或复制您的类。要解决此问题,只需执行以下操作:

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

private:
    static std::optional<Alpha> go() {
        return Alpha();
    }
};
阿尔法类{

public://您已将所有构造函数设置为私有的。
std::optional
无法移动或复制您的类。要解决此问题,只需执行以下操作:

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

private:
    static std::optional<Alpha> go() {
        return Alpha();
    }
};
阿尔法类{

public://Argh!我没想到。谢谢。@Roxy是我一直使用structs的众多原因之一;)@FrançoisAndrieux我看不出使用类的意义。在大多数情况下,它看起来更冗长。默认情况下,使用structs的公共继承是一种幸福。而且,我总是倾向于将类的所有公共部分放在最上面。因此,在大多数情况下,我没有公共关键字,只有私有部分的私有关键字(如果有的话)。对于
struct
,默认值对于成员和继承是公共的。这是我喜欢
struct
而不是
class
的两个原因。(对于类,我倾向于将我的私有成员放在开头,而对于struct,我倾向于将我的私有成员放在末尾……我也更喜欢这样。但这只是我自己。)假设OP的实际类中有任何成员,默认的副本c'tor比
Alpha(const-Alpha&that){}
原因很简单,因为它实际上会复制成员,而不是默认地初始化它们:)唉!我想都忘了。谢谢。@Roxy是我一直使用structs的众多原因之一;)@FrançoisAndrieux我看不出使用类的意义。在大多数情况下,它看起来更冗长。默认情况下,使用structs的公共继承是一种幸福。而且,我总是倾向于将我的类的所有公共部分放在最上面。因此,在大多数情况下,我最终都会使用no public关键字,并且只有私有部分(如果有)的私有关键字。对于
struct
,默认值对于成员和继承是公共的。这是我喜欢
struct
而不是
class
的两个原因。(对于类,我倾向于将我的私有成员放在开头,而对于struct,我倾向于将我的私有成员放在末尾……我也更喜欢这样。但这只是我自己。)假设OP的实际类中有任何成员,默认的副本c'tor比
Alpha(const-Alpha&that){}
原因很简单,因为它实际上会复制成员,而不是默认地初始化它们:)