См.: 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!!!
Но ты действительно не хочешь этого делать.
person
Edward Strange
schedule
04.01.2011
weak_from_raw()
? - person Sam Miller   schedule 05.01.2011