变量名具有作用域(编译时属性),而对象具有生命周期(运行时属性)。对吗?
我经常看到人们谈论临时对象“超出作用域”的情况。但由于临时对象没有名称,因此在这种情况下谈论“作用域”是没有意义的。临时对象的生命周期非常清晰地定义,与作用域无关。您同意吗?
变量有作用域(编译时属性),
没错。虽然我不会称之为属性,但基本上是这样。
而对象有生命周期(运行时属性)。对吗?
有三种类型的变量。每种类型在与生命周期相关的属性方面都有所不同。
注意:自动存储期对象的生命周期绑定到变量的作用域。
我经常看到人们谈论临时对象“超出作用域”的问题。
除非绑定到变量,否则临时对象在表达式结束时被销毁。如果它们绑定到变量(一个const引用),那么它们具有与变量相同的寿命。有时候只是更容易把这个称为作用域,但从技术上讲你是正确的。
但由于临时对象没有名称,因此我认为在这种情况下谈论“作用域”是没有意义的。
从技术上讲是对的。但我认为这样更容易谈论。对我来说(虽然从技术上讲不正确),临时变量(未绑定)的作用域是表达式。这比说临时变量的寿命更容易。
临时对象的生命周期非常明确定义,与作用域无关。你同意吗?
是的。但在这种情况下谈论作用域仍然更自然(即使从技术上讲不正确)。因为大多数人都能理解你试图暗示什么。但当你深入讨论非常技术性的问题时,应该使用正确的术语,而在这种情况下,作用域是不正确的。
临时对象确实有名称,尽管只能由编译器引用。否则编译器怎么引用它们呢?仅仅因为你在实例化后无法引用临时对象并不意味着编译器不能引用它。
f(Foo(), Bar());
将一个const引用绑定到一个临时对象会延长其生命周期至引用的生命周期,因此从某种意义上说,在这种特殊情况下,它与作用域有关:
std::string foo();
int main()
{
// Lifetime of the temporary returned by foo is indeed the scope of bar
const std::string &bar = foo();
}
通常,临时对象仅持续到其所在的完整表达式的末尾。但是,C++有意指定将栈上的临时对象绑定到const引用会延长临时对象的寿命,直到引用本身的寿命结束,并因此避免了普遍的悬空引用错误。
delete pObject
明确终止的对象。 - MSalters