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){}
原因很简单,因为它实际上会复制成员,而不是默认地初始化它们:)