以下代码使用编译和链接Visual Studio(2017和2019都使用/permissive-),但不使用gcc或进行编译clang。
foo.h
Run Code Online (Sandbox Code Playgroud)#include <memory> struct Base { virtual ~Base() = default; // (1) }; struct Foo : public Base { Foo(); // (2) struct Bar; std::unique_ptr<Bar> bar_; };foo.cpp
Run Code Online (Sandbox Code Playgroud)#include "foo.h" struct Foo::Bar {}; // (3) Foo::Foo() = default;main.cpp
Run Code Online (Sandbox Code Playgroud)#include "foo.h" int main() { auto foo = std::make_unique<Foo>(); }
我的理解是,in main.cpp中的Foo::Bar必须是完整类型,因为in中尝试将其删除~Foo(),它是隐式声明的,因此在访问它的每个翻译单元中都是隐式定义的。
但是,Visual Studio不同意,并接受此代码。此外,我发现以下更改使Visual Studio代码遭到拒绝:
(1)非虚拟(2)内联-即Foo() …c++ visual-c++ language-lawyer delete-operator incomplete-type