Это может быть невозможно, но мне интересно, можно ли сделать так, чтобы временные объекты не длились дольше своего первоначального выражения. У меня есть цепочка объектов, которые указывают на родительские объекты, и функция-член, которая будет создавать дочерний объект, упрощенный пример здесь
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
, но есть ли способ предотвратить возникновение подобной ошибки? Я бы хотел избежать динамического выделения, если это возможно.