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

常量成员引用的值初始化

  •  6
  • user168715  · 技术社区  · 14 年前

    我正在查看以下表单的代码:

    class foo
    {
      public:
        foo() {}
    
      //...
    };
    
    class bar
    {
      public:
        bar() : ref() {}
    
      private:
        const foo &ref;
    };
    

    以这种方式使用临时引用初始化引用是否正确?我知道可以用临时变量初始化一个局部变量的常量引用,这样做可以延长临时变量的生命周期,例如。

    const foo &tmp = funcThatReturnsByValue(); //OK
    

    但是,其中一个答案是 initialize reference in initialization list 表明“短期”和“长期”引用之间存在差异,并且初始化 ref 如上所述是未定义的行为(即使 裁判 是一个 const 参考)。

    12.2.5在标准中部分地说,“在构造函数的ctor初始值设定项中,临时绑定到引用成员的行为将一直持续到构造函数退出为止。”这是在描述这种情况吗?

    3 回复  |  直到 14 年前
        1
  •  4
  •   James McNellis    14 年前

    此代码格式错误。不能默认初始化或值初始化引用。

    如果你真的在 ref() ,那么是的,12.2.5将适用,并且当构造函数退出时,临时的将被销毁。

        2
  •  2
  •   Mark Ransom    14 年前

    您的示例并不是创建一个临时的-要做到这一点,您需要将其更改为:

        bar() : ref(foo()) {} 
    

    现在您将引用绑定到一个临时对象,该临时对象将在构造函数的末尾被销毁。你的推荐信无效,这不是好事。

        3
  •  1
  •   Armen Tsirunyan    14 年前

    我想你想做的是:

    bar() : ref(foo()) {}
    

    但不要天真地认为临时工的寿命会延长到有人提到它为止。不,实际上不是。因此,无论常量与否,您都应该用一个普通对象初始化引用。