Я использую enable_shared_from_this<Base>, а затем наследую от Base. При попытке использовать конструктор shared_from_this() в Derived (не список инициализаторов) я получаю исключение. Оказывается, что внутренний слабый указатель имеет значение null и вообще не указывает на this. Как это может произойти? Мой другой пример использования именно этого прекрасно работает. Я даже не знаю, с чего начать. Я посмотрел на исходный код enable_shared_from_this, и мне кажется, что этот указатель всегда будет иметь значение nullptr.
Enable_shared_from_this - пустой внутренний слабый указатель?
Ответ 1
Вы не можете вызвать shared_from_this() в конструкторе объекта. shared_from_this() требует, чтобы объект принадлежал хотя бы одному shared_ptr. Объект не может принадлежать shared_ptr до его создания.
Я бы предположил, что внутренний слабый указатель установлен, когда a shared_ptr впервые переходит в собственность объекта. До этого момента нет ссылочной структуры счета, которую может ссылаться на слабый указатель.
Ответ 2
Ответ Джеймса Макнеллиса прав.
Что касается объяснения самого шаблона enable_shared_from_this, который, как вы видите, ничего не делает, обратите внимание на 7 внизу на этой странице объясняет:
... шаблон
enable_shared_from_thisсодержитweak_ptrобъект, который указывает на производный объект. Там есть проблема с курицей и яйцом, однако, о как инициализировать этот объектweak_ptrкогда нет соответствующихshared_ptrобъект. Реализация трюк заключается в том, что конструкторы дляshared_ptrзнать оenable_shared_from_thisи установитеweak_ptrобъект во время строительства ashared_ptrобъект, которому принадлежит ресурс, которыйenable_shared_from_thisкак публичный базовый класс.
Ответ 3
Концептуально shared_from_this() выбирает shared_ptr, указывающий на this и возвращает его копию.
В конструкторе нет shared_ptr, указывающего на this.