См .: http://boost.org/doc/libs/1_42_0/libs/smart_ptr/sp_techniques.html#in_constructor
Проблема не в том, что объект не построен.Проблема в том, что shared_ptr не был создан.Если бы все, что вам нужно было сделать, это создать shared_ptr и отправить его куда-нибудь, все было бы хорошо.Это когда вы пытаетесь создать shared_ptr для содержания объекта, который вы только что создали.Нет никакого способа соединить их, и поэтому у вас есть большая проблема.
Способ, которым shared_from_this работает, заключается в том, что он ожидает, что вы поместите объект в shared_ptr, прежде чем когда-либо вызовете shared_from_this для получения доступа к нему.Поскольку вы еще этого не сделали, поскольку конструктор объекта еще не завершен, и поэтому shared_ptr не подключен к нему, вы не можете вызвать shared_from_this.
У вас точно такая же проблема сweak_ptr.
Итак, другими словами, эта абсурдная конструкция будет работать:
struct absurd
{
absurd()
{
register(shared_ptr<absurd>(this));
}
};
...
new absurd; // better not assign to a shared_ptr!!!
Но вы действительно не хотите этого делать.