Выяснение константности объекта в его деструкторе - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть класс Stuff с двумя функциями foo (const и non-const):

class Stuff
{
public:
    ~Stuff() { foo(); }

    void foo() const { cout << "const foo" << endl; }
    void foo()       { cout << "non-const foo" << endl; }
};

Вот что я пытаюсь сделать:

  1. Если материал был const, вызовите const foo в деструкторе Stuff.

  2. , если материал не был const, вызовите non-const foo в деструкторе Stuff.

Я надеялся, что простое определение деструктора, как показано выше, сработает, но оказывается, что константность удаляется прямо перед выполнением деструктора (она применяется сразу после завершения конструктора, поэтому я не могуустановите там любой флаг).Чтобы сделать это более понятным, вот пример:

{ Stuff stuff; }
{ const Stuff cstuff; }

Этот код печатает «non-const foo» дважды.Я хочу, чтобы он напечатал «non-const foo», а затем «const foo».Это возможно с C ++?

РЕДАКТИРОВАТЬ: Несколько человек просят больше контекста.В реальном коде материал - это, в основном, дескриптор некоторых данных.Если к содержимому обращаются неконстантным образом, я предполагаю, что данные были изменены, поэтому мне нужно сообщить об этом другим процессам (MPI), используя функцию foo (после того, как я закончу изменять это -> в деструкторе, когдаЯ отпускаю ручку).Если к нему обращались const-способом, я знаю, что мне не нужно ничего передавать, поэтому я звоню не-const foo, который ничего не делает.

1 Ответ

0 голосов
/ 19 декабря 2018
Семантика

[...] const и volatile (7.1.6.1) не применяется к разрушаемому объекту.Они перестают действовать, когда запускается деструктор для самого производного объекта (1.8).

12.4 / 2 [class.dtor] в N4141.

Так что нет, это не таквозможно.

...