7

为什么不允许使用以下代码是否有原因(除了标准规定之外)?

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

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

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

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

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

我打算做这样的事情

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

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

4

1 回答 1

4

首先,每个类必须只有一个析构函数。在析构函数上允许使用ref-qualifiers可以使析构函数重载。

另一个可能的原因是要与constand volatilequalifiers保持一致:

不应声明析构函数constvolatileconst volatile(9.3.2)。constvolatile语义(7.1.5.1)不适用于正在破坏的对象

我想,为了一致性,右值和左值之间的区别不适用于正在破坏的对象。

于 2020-02-28T09:23:14.073 回答