【发布时间】:2011-11-26 08:47:45
【问题描述】:
这可能是不可能的,但我想知道是否有可能让一个暂时的东西永远不会超过它原来的表达方式。我有一个指向父对象的对象链,以及一个将创建子对象的成员函数,这里有一个简化的例子
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 引用,它的父对象将无法生存,并且我会遇到段错误。我可以隐藏person 的复制构造函数和赋值运算符,但是有什么办法可以防止这种错误的发生吗?如果可能,我想避免动态分配。
【问题讨论】:
-
请注意,这段代码“不好”,就像写
const int &i = std::vector<int>(1)[0];“不好”一样。vector不会阻止你写,也不需要。这里的关键是,因为摧毁妈妈会使婴儿无法使用,所以婴儿是妈妈的一部分。这就是设计的问题,这是违反直觉的。您正在尝试通过防止出现任何诸如孤儿之类的东西来修补它,这可能是合适的,但您还应该考虑孤儿是否应该具有更好的定义行为,或者应该更明显地创建一个不好的东西。跨度> -
同意史蒂夫:这只是糟糕的设计展示。裸指针的出现应该表明有些东西已经关闭了。
标签: c++ reference object-lifetime const-reference temporaries