使用 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
的指针)。
为什么不能在 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
的指针)。