【问题标题】:In C++, is it safe to extend scope via a reference?在 C++ 中,通过引用扩展范围是否安全?
【发布时间】:2010-09-20 09:08:20
【问题描述】:

在 C++ 中,通过引用扩展范围是否安全?

在代码中,我的意思是:

MyCLass& function badIdea()
{
    MyClass obj1;
    ...
    return obj1;
}

【问题讨论】:

    标签: c++ reference scope


    【解决方案1】:

    通过引用扩展范围是不安全的。 C++ 中的对象在 obj1 超出范围时不会被引用计数,它将被删除,引用 badIdea() 的结果只会给你带来麻烦

    【讨论】:

    • 问题是关于 C++ 和引用绑定。引用计数不参与其中。我添加了我自己的答案,但简而言之,您可以通过引用绑定来扩展对象的范围,但在设计中应该小心。不懂就不要做。
    • 我认为他提到了引用计数,因为在支持引用计数的语言中,您可以返回引用而不超出范围(C++ 不是其中之一其中,当然)。
    • 我可以看到“引用计数”这个术语是如何混淆问题的,我试图暗示其他语言有可能使分配的对象保持活跃的机制,这可能不是一个好主意
    【解决方案2】:

    唯一可以使用引用扩展范围的地方是在 namespace 或函数范围中使用 const 引用(不包括类成员)。

    const int & cir = 1+1; // OK to use cir = 2 after this line 
    

    这个技巧在Andrei Alexandrescu's 非常酷的scope guard 中使用,以便捕获对具体作用域保护的基类的const 引用。

    【讨论】:

    • 请注意,这只是“扩展范围”,因为通常非常狭窄的临时“范围”被扩展到父范围,这与 OP 所要求的完全不同。感谢提到 C++ 的一个鲜为人知的方面,很多人起初对此感到困惑。
    【解决方案3】:

    请澄清你的意思。

    假设您打算这样做:

    int * p = NULL;
    {
      int y = 22;
      p = &y;
    }
    *p = 77; // BOOM!
    

    那么不,绝对不是,范围不会通过引用来扩展。

    您可能想查看智能指针,例如来自 boost 库:clickety

    【讨论】:

    • 引用和指针一样,只是不能重新绑定
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 2016-01-15
    • 2020-07-11
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多