X. *_*Sun 3 c++ pimpl-idiom unique-ptr in-class-initialization gcc8
我正在使用 pimpl idiom 和 unique_ptr 编写一些代码。当我尝试使用类内初始化将 unique_ptr 默认设置为 nullptr 时,gcc 给出了编译错误,而 clang 和 msvc 都成功编译了代码。如果我没有使用类内初始化,错误就会消失。
\n\n// A.h\n#pragma once\n\n#include <memory>\n\nusing namespace std;\n\nclass B;\nclass A\n{\nprivate:\n ////////////////////////\n // here gives the error!\n ////////////////////////\n unique_ptr<B> impl{nullptr}; // error only with gcc, \n // ok with clang and msvc\n unique_ptr<B> impl2; // ok with all three\n\npublic:\n A();\n ~A();\n};\nRun Code Online (Sandbox Code Playgroud)\n\n// A.cpp\n#include "A.h"\n\nclass B\n{\nprivate:\n int b{5};\n\npublic:\n B() = default;\n ~B() = default;\n};\n\nA::A() = default;\nA::~A() = default;\nRun Code Online (Sandbox Code Playgroud)\n\n// main.cpp\n#include "A.h"\n\nint main()\n{\n A a;\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n当我编译上面的代码时,gcc抱怨“错误:\xe2\x80\x98sizeof\xe2\x80\x99对不完整类型\xe2\x80\x98B\xe2\x80\x99的无效应用”。我尝试过 gcc 8.3 和 gcc 9.1 但没有成功。这是编译器错误吗?谢谢!
\n\n编辑: \n我按照@eerorika的建议尝试了。如果头文件和源文件合并为一个文件,则可以正常编译,但不能分开。
\n\n编辑\n确认是编译器错误,并已在 gcc9.2 中修复。
\n该程序,特别是默认成员初始化程序,格式良好。如果编译器拒绝编译,那么据我所知,这是编译器中的一个错误。
我可以用 GCC 9.1 重现该问题,但不能用 9.2 或 trunk 重现该问题,因此它似乎已得到修复。对于旧版本,您可能需要放弃使用默认成员初始化程序作为解决方法。