Return 可选 class 方法

Return optional from class method

我在 class 中有一个可选成员,我想通过一种方法按值 return。 示例代码:

#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;
}

代码输出一些垃圾值。

我该如何实现?


根据我的理解,可选存储为基础类型(不仅仅是引用)完全分配的内存,并且在 returning 一个可选变量时,基础类型的复制构造函数应该启动,这应该按原样将内存复制到新的可选值 returned.

你需要使用optional的构造函数来确保它包含一个对象:(假设bar的冗余复制构造函数,它阻止它被构造,被删除)

foo()
    : abc{bar{100}}
{
}

或者,在创建 optional 之后:

void init(){
    abc = bar{100};
}

否则,optional 将保持空状态,并且在空 optional 上调用 -> 会导致 undefined behavioroptional 的复制构造函数在源为空时不复制构造包含的对象。

std::optional 就像一个智能指针,它默认为“空”值,因此访问其成员将是未定义的行为。使用前需要初始化:

void init(){
  abc = bar();
  abc->a = 100;
}

请注意,目前 bar 除了通过复制构造函数外无法构造,因此您需要添加默认构造函数或采用 int 参数的构造函数或删除不必要的副本构造函数。