使用 std::optional<A> 作为 class A 的 class 成员

Using std::optional<A> as a class member of class A

为什么不能在 class A 中定义 std::optional 类型的 class 成员?

示例:

#include <optional>

class A {
public:
    A(std::optional<A> optional = {}) : optional_(optional) { }
    ~A() = default;
private:
    std::optional<A> optional_;
};

编译器错误:

error: incomplete type 'A' used in type trait expression
   : public integral_constant<bool, __is_trivially_destructible(_Tp)> {};
                                    ^
error: incomplete type 'A' used in type trait expression
   : public integral_constant<bool, __is_constructible(_Tp, _Args...)>
                                    ^

optional<T> 要求 T 是一个完整的类型(因此具有已知的大小)。在 class A 的定义完成之前,A 是一个不完整的类型。因此错误。

无法让任何类型 T 持有类型 optional<T> 的成员变量,因为 optional<T> 本身 有一个成员T 类型的变量。您可以 heap-allocate 一个 optional<T>(或者只是一个 T,因为您将存储一个可能是 nullptr 的指针)。