【问题标题】:How to make the default destructor non-inline?如何使默认析构函数非内联?
【发布时间】:2018-12-05 07:49:27
【问题描述】:

如何强制编译器将类的默认析构函数设为非内联?

这样做的一种方法是编写一个空的析构函数定义,但感觉很混乱,而且你会从静态分析器(在我的例子中为 clang-tidy)收到警告,= default应该用于微不足道的析构函数。

要详细说明实际用例 - 目标是有类似的东西:

MyClass.h

class MyClassImpl;

class MyClass {
    std::unique_ptr<MyClassImpl> m_impl;
public:
    MyClass();
    // and some other methods
};

std::unique_pointer 指向不完整的类型,该类型在标头中前向声明,并且定义仅在源文件中已知。

上面的代码会报编译错误:

error: use of undefined type 'MyClassImpl'

实际的问题是,编译器生成的MyClass的默认析构函数是内联的,所以需要MyClassImpl的完整类型信息。

这可以通过为MyClass 添加一个空的析构函数来解决(通过在头文件中声明并在源文件中定义,因为在头文件中定义将隐式使其内联,这将导致相同的错误)。

但这是现代 C++ 中唯一的方法吗?

【问题讨论】:

    标签: c++ c++11 inline destructor unique-ptr


    【解决方案1】:

    只需在cpp文件中按照普通方法实现即可:

    MyClass.h

    class MyClassImpl;
    
    class MyClass {
        std::unique_ptr<MyClassImpl> m_impl;
    public:
        MyClass();
        ~MyClass() /*noexcept*/;
    
        // and some other methods
    };
    

    在cpp中

    MyClass::~MyClass() /*noexcept*/ = default;
    

    【讨论】:

    • 不知道default可以单独定义,很好知道。
    • 这会起作用,因为cpp 文件已经有一个include 的标头,其中MyClassImpl 已完全定义。 MyClass 的所有其他方法也需要这个。
    • @Slava:请注意,这与将其放在类中有些不同(用户提供,is_trivially_destructible,...)。
    • 很好,不知道default 可以在类定义之外使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2019-11-09
    • 2011-01-06
    • 2012-07-14
    • 2018-10-28
    • 1970-01-01
    相关资源
    最近更新 更多