Предотвратить продление срока действия временного объекта?

Это может быть невозможно, но мне интересно, можно ли сделать так, чтобы временные объекты не длились дольше своего первоначального выражения. У меня есть цепочка объектов, которые указывают на родительские объекты, и функция-член, которая будет создавать дочерний объект, упрощенный пример здесь

class person{
    string name;
    person * mommy;
public:
    person(const string & nam, person * m = 0) : name(nam), mommy(m) {}
    person baby(const string & nam){
        return person(nam, this);
    }
    void talk() const{
        if (mommy) mommy->talk();
        cout << name << endl;
    }
};

int main(){
    person("Ann").baby("Susan").baby("Wendy").talk();     // fine

    const person & babygirl = person("Julie").baby("Laura"); // not fine

    babygirl.talk();    // segfault
    return 0;
}

Способ, которым я хочу использовать person - передать его в функцию, и что-то вроде этого:

void use(const person & p) {
    p.talk();
}
use(person("Anna").baby("Lisa"));

Это нормально.

Это будет работать нормально до тех пор, пока ни один из временных элементов не переживет исходное выражение, но если я привяжу один из конечных временных элементов к ссылке const, его родители не переживут, и я получу segfault. Я могу скрыть конструктор копирования и оператор присваивания person, но есть ли способ предотвратить возникновение подобной ошибки? Я бы хотел избежать динамического выделения, если это возможно.

8
задан Konrad Rudolph 27 September 2011 в 20:13
поделиться