Почему деструктор не может иметь эталонные квалификаторы? - PullRequest
7 голосов
/ 28 февраля 2020

Есть ли причина (кроме , потому что стандарт так говорит ), почему следующий код не разрешен?

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

Я знаю, что это незаконно, но я хочу знаю, почему.

Я думал о старой доброй проблеме избегать безымянных экземпляров , т. е. при использовании объектов защиты, таких как:

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

Это юридический код, но, очевидно, подвержен ошибкам, так как защита замка будет уничтожена сразу после ее создания, потому что это временный (неназванный) объект.

Я планировал сделать что-то подобное

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

и получить компилятор ошибка, если тип построен как временный.

1 Ответ

4 голосов
/ 28 февраля 2020

Во-первых, в классе должен быть только один деструктор. Разрешение ref-qualifiers на деструктор позволило бы перегрузить деструктор.

Другая возможная причина - соответствие const и volatile квалификаторам :

Деструктор не должен быть объявлен const, volatile или const volatile (9.3.2). Семантика const и volatile (7.1.5.1) не применяется к разрушаемому объекту .

Я полагаю, для согласованности, различения между rvalues ​​ и lvalues ​​ не применяется к разрушаемому объекту.

...