这可能是不可能的,但我想知道是否有可能通过它的原始表达来保持暂时的永久。我有一个指向父对象对象链,这将创建一个子对象的成员函数,一个简单的例子是在这里防止暂时延长其寿命?
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"));
很好。
只要没有一个临时存活通过原始表达式,但是如果我将其中一个临时临时对象绑定到一个常量引用,它的父项就不能存活,并且我得到一个段错误。我可以隐藏person
的拷贝构造函数和赋值操作符,但有什么办法可以防止这种错误发生?如果可能,我想避免动态分配。
@Konrad:Ironic; - ] – ildjarn
请注意,这段代码是“不好”的相同方式写'const int&i = std :: vector(1)[0];'是“不好”。 'vector'不会阻止你写这个,也不需要。这里的关键是,因为摧毁妈妈使宝宝无法使用,宝宝是妈妈的一部分。这就是设计的问题,这是违反直觉的。你试图通过阻止孤儿这样的事情来补救,这可能是合适的,但你也应该考虑孤儿是否应该有更好的定义行为,或者应该更明显是一个坏的事情来创建。 –
同意史蒂夫:这只是糟糕的设计展示。裸指针的外观应该已经给出了某种东西没有。 –