代码之家  ›  专栏  ›  技术社区  ›  Potatoswatter

当跳过声明时,为什么需要琐碎的析构函数?

  •  13
  • Potatoswatter  · 技术社区  · 8 年前

    goto switch 可以跳过声明语句,因为它没有初始值设定项,构造简单,对象也很普通 可破坏的 .

    对析构函数进行约束的理由是什么?

    struct trivial {
        trivial() = default;
        ~ trivial() = default;
    };
    
    struct semi_trivial {
        semi_trivial() = default;
        ~ semi_trivial() noexcept { do_something(); }
    };
    
    void foo() {
        goto good_label;  // OK
        trivial foo;
    good_label:
    
        goto bad_label;   // Error: this goto statement
        semi_trivial bar; // cannot jump over this declaration.
    bad_label:
    
        std::cout << "hi\n";
    }
    
    1 回复  |  直到 8 年前
        1
  •  5
  •   Community CDub    4 年前

    目前的措辞是由于 N2762

    6.7标准分类号:

    跳过自动变量的定义会产生一个问题,即是否应该在块的末尾运行该变量的析构函数。因此,析构函数需要是微不足道的,即没有效果。类似地,默认构造函数(可能用于初始化对象的构造函数)也需要不做任何事情,即微不足道。无需其他要求。

    我认为需要记住的情况是:

    int i = 2;
    switch (i) {
      case 1:
        semi_trivial st;
        do_something(st);
        break;
      case 2:
        break; // should st be destructed here?
    }
    

    事实上,这不是一个容易回答的问题。调用析构函数显然是不正确的。没有很好的方法来判断它是否应该被调用。这个 st 此处的变量仅用于 case 1 语句,如果它的析构函数被 case 2 break 语句,即使它在那里完全没有使用过,也没有构造。