我正在使用带有 unique_ptr 的 pimpl idiom 编写一些代码。当我尝试使用类内初始化将unique_ptr默认设置为nullptr时,gcc给出了编译错误,而clang和msvc都成功编译了代码。如果我不使用类内初始化,错误就会消失。
// A.h
#pragma once
#include <memory>
using namespace std;
class B;
class A
{
private:
////////////////////////
// here gives the error!
////////////////////////
unique_ptr<B> impl{nullptr}; // error only with gcc,
// ok with clang and msvc
unique_ptr<B> impl2; // ok with all three
public:
A();
~A();
};
// A.cpp
#include "A.h"
class B
{
private:
int b{5};
public:
B() = default;
~B() = default;
};
A::A() = default;
A::~A() = default;
// main.cpp
#include "A.h"
int main()
{
A a;
return 0;
}
当我编译上述代码时,gcc 抱怨“错误:'sizeof' 对不完整类型'B' 的无效应用”。我已经尝试过 gcc 8.3 和 gcc 9.1 都没有成功。这是编译器错误吗?谢谢!
编辑: 我按照@eerorika 的建议进行了尝试。如果头文件和源文件合并为一个文件,可以正常编译,但不能分开。
编辑 确认是编译器错误并已在 gcc9.2 中修复。