相关疑难解决方法(0)

编译器可以将隐式声明的虚拟析构函数的实现放在单个单独的转换单元中吗?

以下代码使用编译和链接Visual Studio(2017和2019都使用/permissive-),但不使用gcc或进行编译clang。

foo.h

#include <memory>

struct Base {
    virtual ~Base() = default; // (1)
};

struct Foo : public Base {
    Foo();                     // (2)
    struct Bar;
    std::unique_ptr<Bar> bar_;
};
Run Code Online (Sandbox Code Playgroud)

foo.cpp

#include "foo.h"

struct Foo::Bar {};            // (3)
Foo::Foo() = default;
Run Code Online (Sandbox Code Playgroud)

main.cpp

#include "foo.h"

int main() {
    auto foo = std::make_unique<Foo>();
}
Run Code Online (Sandbox Code Playgroud)

我的理解是,in main.cpp中的Foo::Bar必须是完整类型,因为in中尝试将其删除~Foo(),它是隐式声明的,因此在访问它的每个翻译单元中都是隐式定义的。

但是,Visual Studio不同意,并接受此代码。此外,我发现以下更改使Visual Studio代码遭到拒绝:

  • 使(1)非虚拟
  • 定义(2)内联-即Foo() …

c++ visual-c++ language-lawyer delete-operator incomplete-type

8
推荐指数
1
解决办法
145
查看次数