【问题标题】:In-class initialization of std::unique_ptr to an incomplete typestd::unique_ptr 的类内初始化为不完整类型
【发布时间】:2021-08-11 12:42:17
【问题描述】:

我无法在 Visual Studio 2019 中使用 clang-cl 编译以下代码。尽管 VC++ 编译成功。它也适用于自定义删除器。它应该像示例中那样工作吗?如果不是,为什么?

example.h

#include <memory>

class A;

class B {
    std::unique_ptr<A> a{ make_a() };
    std::unique_ptr<A> make_a();
public:
    B(); ~B();
};

example.cpp

#include "example.h"

class A {};

std::unique_ptr<A> B::make_a() {
    return std::unique_ptr<A>(new A());
}

B::B() = default;
B::~B() = default;

main.cpp

#include "example.h"

int main()
{
    B b;
    return 0;
}

错误:“sizeof”对不完整类型“A”的无效应用

【问题讨论】:

  • 请分享错误信息

标签: c++ unique-ptr incomplete-type


【解决方案1】:

它应该像示例中那样工作吗?

是的,这个例子应该可以工作。在A 完成之后定义B::~B 就足够了(也是必要的)。

一些标准规则:

[unique.ptr.general]

... unique_ptr的模板参数T可能是不完整类型。

[unique.ptr.dltr.dflt]

default_delete的模板参数T可能是不完整类型。


顺便说一句,小建议:

std::unique_ptr<A>
B::make_a() {
    return std::make_unique<A>();
}

【讨论】:

  • 你能告诉你使用什么编译器吗?
  • @Oleksa Clang 和 Linux 上的 GCC。
  • 您认为 Windows 上的 Clang 可能会有所不同吗?
  • @Oleksa 如果显示的示例不起作用,那么编译器或标准库实现显然似乎不同。
猜你喜欢
  • 2012-05-12
  • 2018-06-04
  • 1970-01-01
  • 2015-05-01
  • 2020-04-17
  • 1970-01-01
  • 2018-10-25
  • 2018-03-11
  • 2016-05-05
相关资源
最近更新 更多