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

为什么析构函数不能有引用限定符?

c++
  •  1
  • Timo  · 技术社区  · 5 年前

    是否有其他原因(除了 因为标准是这么说的 )为什么不允许使用以下代码?

    struct Foo
    {
        ~Foo() && {}
        ~Foo() & {}
    };
    

    我知道这是违法的,但我想知道为什么。

    我在想那位老人 避免未命名实例 问题,即使用防护对象时,如:

    void do_something()
    {
        std::lock_guard{my_mutex};
        // some synchronized operation
    }
    

    这是法律代码,但显然容易出错,因为锁防护在构建后会立即被销毁,因为它是一个临时(未命名)对象。

    我本来打算做这样的事

    struct Foo
    {
        ~Foo() && = delete;
        ~Foo() & = default;
    };
    

    如果该类型被构造为临时类型,则会出现编译器错误。

    0 回复  |  直到 5 年前
        1
  •  4
  •   jfMR    5 年前

    首先,每个类只能有一个析构函数。允许 ref限定符 在析构函数上,可以使析构函数过载。

    另一个可能的原因是与 const and volatile qualifiers :

    不得宣布破坏者 const , 不稳定的 const volatile (9.3.2). const 不稳定的 语义(7.1.5.1)不适用于 被毁坏的物体 .

    我想,为了保持一致性,区分 右值 阿尔瓦卢斯 不适用于正在销毁的物体。