【问题标题】:Using std::optional<A> as a class member of class A使用 std::optional<A> 作为类 A 的类成员
【发布时间】:2020-11-30 12:14:08
【问题描述】:

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

例子:

#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...)>
                                    ^

【问题讨论】:

  • 在构造A 时,必须分配足够的内存来存储A 的所有成员。但是A 可能包含一个A,它可能包含一个A,它可能包含一个A... 无限。如果A 可以保存std::optional&lt;A&gt;,则堆栈上需要无限内存。

标签: c++ c++17 stdoptional


【解决方案1】:

optional&lt;T&gt; 要求 T 是一个完整的类型(因此具有已知的大小)。在类A 的定义完成之前,A 是一个不完整的类型。因此出现错误。

没有办法让任何类型T 拥有optional&lt;T&gt; 类型的成员变量,因为optional&lt;T&gt; 本身 有一个T 类型的成员变量。你可以堆分配一个optional&lt;T&gt;(或者只是一个T,因为你要存储一个可能是nullptr的指针)。

【讨论】:

  • 谢谢。在现代 c++ 中定义递归选项的常用方法是什么,实现树的最简单示例?我也试过std::unique_ptr&lt;A&gt;,但也没有用。但它适用于std::shared_ptr&lt;A&gt;
  • @Yannic std::unique_ptr&lt;A&gt; 独家拥有。如果它“不起作用”(这是一个非常模糊的描述),请发布一个包含这些详细信息的问题。
  • @Yannic unique_ptr 示例(只移动,不复制)
  • 没关系!把事情搞混了,弄糊涂了,但现在明白了
猜你喜欢
  • 2021-05-16
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
相关资源
最近更新 更多