问题描述
我在一个类中有一个可选成员,我想通过一种方法按值返回。 示例代码:
#include <stdio.h>
#include <optional>
#include <iostream>
using namespace std;
class bar {
public:
int a;
bar(const bar &obj) {
a = obj.a;
}
};
class foo {
public:
void init(){
abc->a = 100;
}
optional<bar> get() {
return abc;
}
optional<bar> abc;
};
int main()
{
foo temp;
temp.init();
auto copied = temp.get();
cout << "Expected value is 100,got: " << copied->a;
return 0;
}
代码输出一些垃圾值。
我该如何实现?
据我所知,optional为底层类型(不只是引用)存储了完全分配的内存,并且在返回可选变量的同时,底层类型的copy构造函数也应加入其中,它应按原样复制内存返回新的可选值。
解决方法
您需要使用optional
的构造函数来确保它包含一个对象:(假设bar
的冗余副本构造函数(阻止了其构造)已删除)
foo()
: abc{bar{100}}
{
}
,或者在创建optional
之后:
void init(){
abc = bar{100};
}
否则,optional
保持为空状态,而在空的->
上调用optional
则得到undefined behavior。当源为空时,optional
的复制构造函数不会复制构造包含的对象。
std::optional
就像一个智能指针,它默认为“ null”值,因此访问其成员将是不确定的行为。您需要在使用前对其进行初始化:
void init(){
abc = bar();
abc->a = 100;
}
请注意,bar
只能通过复制构造函数进行构造,因此您需要添加默认构造函数或带有int
参数的构造函数,或删除不必要的复制构造函数。