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

Tim*_*imo 7 c++ destructor ref-qualifier

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

struct Foo
{
    ~Foo() && {}
    ~Foo() & {}
};
Run Code Online (Sandbox Code Playgroud)

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

我在考虑避免未命名实例问题,即在使用保护对象时,例如:

void do_something()
{
    std::lock_guard{my_mutex};
    // some synchronized operation
}
Run Code Online (Sandbox Code Playgroud)

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

我正打算做这样的事情

struct Foo
{
    ~Foo() && = delete;
    ~Foo() & = default;
};
Run Code Online (Sandbox Code Playgroud)

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

眠りネ*_*ネロク 4

首先,每个类必须只有一个析构函数。在析构函数上允许引用限定符将使析构函数重载成为可能。

const另一个可能的原因是与和volatile限定符保持一致:

不得声明析构函数constvolatileconst volatile(9.3.2)。const并且volatile语义(7.1.5.1)不适用于被破坏的对象

我想,为了保持一致性,区分右值左值并不适用于被破坏的对象。