代码之家  ›  专栏  ›  技术社区  ›  fredoverflow

临时对象有范围吗?

  •  7
  • fredoverflow  · 技术社区  · 14 年前

    名字有 范围 (编译时属性),而对象具有 寿命 (运行时属性)。对吗?

    我经常看到人们谈论临时物品“超出范围”。但是由于临时对象没有名称,我认为在这个上下文中谈论“范围”是没有意义的。临时对象的生存期是 very clearly defined 与范围无关。你同意吗?

    5 回复  |  直到 14 年前
        1
  •  6
  •   Loki Astari    14 年前

    名称具有作用域(编译时属性),

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

    对象具有生存期(运行时属性)。对吗?

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

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

    注意:自动存储持续时间对象具有绑定到变量范围的生存期。

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

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

    但是由于临时对象没有名称,我认为在这个上下文中谈论“范围”是没有意义的。

    技术上是的。但我认为这只是让谈论更容易。对我来说(尽管技术上不正确),临时(非绑定)的范围是表达式。这比临时变量的寿命更容易说。

    临时对象的生存期是非常明确的,与范围无关。你同意吗?

    对。但是讨论范围仍然感觉更自然(即使它在技术上不正确)。因为大多数人都明白你的意思。但是,当你下来谈论非常技术性的东西时,你应该使用正确的术语,在这个上下文中的范围是不正确的。

        2
  •  4
  •   Fred Nurk    14 年前

    临时术语的使用寿命与句法块几乎没有关系,但是“范围”作为一个词而不是一个技术术语可以用在其他方面。重要的问题是,当人们使用“范围”来指代临时物品时,你是否感到困惑。(从我的视角看,你似乎不是。)

    既然你在谈论用这个词与他人交流,那么交流才是真正重要的。如果您是通过编写标准文档来定义术语,或者试图在定义术语的上下文中解释此类文档,那么情况会有所不同。当然,解释ISO 14882会涉及到与他人的沟通,因此在这种情况下,如果必要的话,你只需要要求澄清。

    使所有非标准化的通信都成为标准化的通信是有反作用的,而且在 任何一个 要求高精度时的情况。C++标准为此广泛使用实例。

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

        3
  •  1
  •   MSalters    14 年前

    我见过有人说,“一个物体超出了范围”,意思是(用你的话说)“当这个物体的名字超出范围时,它的生命就结束了”。如果您使用这种简短的形式,很自然地会说Temporay对象也超出了范围。

        4
  •  0
  •   wilhelmtell    14 年前

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

    f(Foo(), Bar());
    

    编译器必须至少引用其中一个临时变量,即使您作为程序员不能引用其中任何一个。临时对象没有作用域。

        5
  •  0
  •   icecrime    14 年前

    绑定到常量引用会将临时引用的生存期延长到引用的生存期,因此在某种意义上,它 在这种特殊情况下与范围有关:

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

    this article 从药草提取物:

    通常情况下,临时物体会持续 只有到满了为止 它出现的表达式。 但是,C++故意指定 将临时对象绑定到 对堆栈上常量的引用 延长了 临时的到生命的 引用自身,从而避免 否则会很普遍 悬空参考错误。