这可能是不可能的,但我想知道是否可以让临时变量永远保持在其原始表达式之后。我有一系列指向父对象的对象链,以及一个创建子对象的成员函数,以下是一个简化的示例:
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
不会阻止你编写这样的代码,也不需要。关键在于,因为摧毁“妈妈”会使“宝宝”无法使用,所以“宝宝”是“妈妈”的一部分。这就是设计上的问题,它是违反直觉的。你试图通过防止存在孤儿来修补这个问题,这可能是合适的,但你也应该考虑孤儿是否应该有更好定义的行为,或者是否应该更明显地成为一个不好的创建方式。 - Steve Jessop