临时对象有范围吗?

时间:2010-11-24 14:08:33

标签: c++ object scope temporary lifetime

名称具有范围(编译时属性),而对象具有生存期(运行时属性)。正确?

我经常看到人们谈论临时对象“超出范围”。但由于临时对象没有名称,我认为在这种情况下讨论“范围”是没有意义的。临时对象的生命周期为very clearly defined,与范围无关。你同意吗?

5 个答案:

答案 0 :(得分:6)

  

名称具有范围(编译时属性),

是。我不会称之为财产。但基本上是的。

  

而对象具有生命周期(运行时属性)。正确?

有三种类型的变量。每种类型都与生命周期有不同的属性。

  • 自动存储时间:
  • 静态存储时间
  • 动态存储时间

注意:自动存储持续时间对象的生命周期与变量的范围绑定。

  

我经常看到人们谈论临时物品“超出范围”。

除非绑定到变量,否则临时在表达式的末尾被销毁。如果它们绑定到变量(const引用),那么它们与变量具有相同的寿命。有时将它作为范围更容易引用,但从技术上讲,你是正确的。

  

但是由于临时对象没有名称,我认为在这种情况下讨论“范围”是没有意义的。

技术上是的。但我认为这只会让谈论更容易。对我而言(虽然技术上不正确)临时(未绑定)的范围是表达式。它比临时变量的寿命更容易说明。

  

临时对象的生命周期定义非常明确,与范围无关。你同意吗?

是。但谈论范围仍然感觉更自然(即使它在技术上不正确)。因为大多数人都明白你想要暗示什么。但是当你开始谈论非常技术性的东西时,你应该使用正确的术语和范围在这种情况下是不正确的。

答案 1 :(得分:4)

临时学生的生命与语法障碍几乎没有关系,但“范围” - 作为一个词而不是技术术语 - 可以用于其他方式。重要的问题是,当人们使用“范围”来指代临时工时,你是否感到困惑。 (从我的POV看,你似乎没有。)

由于您正在谈论使用该术语与他人交流,因此沟通非常重要。如果您通过编写标准文档或尝试在定义的术语的上下文中解释此类文档来定义术语,则情况会有所不同。当然,解释ISO 14882将涉及与他人沟通,因此在必要时您必须要求澄清。

使所有非标准通信成为标准是适得其反的,并且当需要高精度时,在 情况下使用代码通常会更好。出于这个原因,C ++标准广泛使用了示例。

另一个例子,经常使用“调用构造函数”,但从技术上讲,你不能直接调用ctor;相反,ctors是对象初始化的一部分。这就是为什么有一个明确的新形式只是为了构造一个对象。 (有趣的是,你可以直接调用析构函数。)但是,我希望在大多数情况下都能理解这个短语,尽管我不主张在标准语境中使用它。

答案 2 :(得分:1)

我看到有人说“一个对象超出了范围”,这意味着(用你的说法)“当对象的名称超出范围时,对象的生命周期结束”。如果你使用那个简短的形式,很自然地说临时对象也超出了范围。

答案 3 :(得分:0)

临时对象确实有名称,尽管只能由编译器引用。否则编译器将如何引用它们?仅仅因为一旦实例化就无法引用临时值并不意味着编译器无法引用它。

f(Foo(), Bar());

编译器必须引用至少一个临时工,即使你作为程序员也不能引用它们中的任何一个。临时对象确实有范围。

答案 4 :(得分:0)

绑定到const引用会将临时的生命周期延长到引用的生命周期,因此从某种意义上说, 与此范围内的范围有关:

std::string foo();

int main()
{
    // Lifetime of the temporary returned by foo is indeed the scope of bar
    const std::string &bar = foo();
}

请参阅Herb Sutter的this article

  

通常,临时对象会持续   直到完整结束   它出现的表达方式。   但是,C ++故意指定   将临时对象绑定到   引用堆栈上的const   延长寿命   暂时的到了   引用自己,从而避免了什么   否则会很常见   悬空参考错误。