首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果标准指定它有一个析构函数,那么类是否应该是可销毁的?

如果标准指定它有一个析构函数,那么类是否应该是可销毁的?
EN

Stack Overflow用户
提问于 2021-09-26 12:19:08
回答 1查看 147关注 0票数 4

考虑一下std::latch [thread.latch.class]

代码语言:javascript
复制
namespace std {
  class latch {
  public:
    static constexpr ptrdiff_t max() noexcept;

    constexpr explicit latch(ptrdiff_t expected);
    ~latch();

    latch(const latch&) = delete;
    latch& operator=(const latch&) = delete;

    void count_down(ptrdiff_t update = 1);
    bool try_wait() const noexcept;
    void wait() const;
    void arrive_and_wait(ptrdiff_t update = 1);

  private:
    ptrdiff_t counter;  // exposition only
  };
}

注意,析构函数存在。这意味着这应适用于:

代码语言:javascript
复制
static_assert(std::is_trivially_destructible_v<std::latch> == false);

然而,它与实现(MSVC、libstdc++、libc++)相反:https://godbolt.org/z/6s8173zTc

这是:

  • 实现自由(实现是正确的,is_trivially_destructible_v可以是truefalse)
  • 每个实现中的实现缺陷(实现应该具有std::latch的非平凡析构函数)
  • 标准缺陷(标准不应该指定具有非平凡析构函数的std::latch )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-26 12:50:05

这是执行自由。C++标准定义了类,类的实现达到了实现。

在某些类中,标准显式地强制执行一个微不足道的析构函数。例如,如果一个现有类是可销毁的,那么它的std::optional也是必须是可销毁的。这一点需要说清楚。

因此,除非某个地方有一个明确的语句,说明类是可构造的,或者不是可构造的,否则这取决于实现(在可能的情况下)。

查看gcc的头文件:它不仅声明,而且显式定义析构函数:

代码语言:javascript
复制
~latch() = default;

在此基础上,编译器可以计算出整件事情都是微不足道的可销毁的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69334861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档