const成员引用的值初始化

时间:2010-11-10 19:21:01

标签: c++ reference

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

class foo
{
  public:
    foo() {}

  //...
};

class bar
{
  public:
    bar() : ref() {}

  private:
    const foo &ref;
};

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

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

然而,相关initialize reference in initialization list的答案之一表明“短期”和“长期”引用之间存在差异,并且如上所述初始化ref是未定义的行为(即使refconst引用)。

标准中的12.2.5部分地说,“在构造函数的ctor-initializer中临时绑定到引用成员,直到构造函数退出为止。”这是描述这种情况吗?

3 个答案:

答案 0 :(得分:4)

此代码格式错误。您无法默认初始化或初始化参考值。

如果你实际上在ref()内有一个表达式,那么是的,12.2.5将适用,当构造函数退出时,临时将被销毁。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

我想你想做的是:

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

但不要天真地认为临时的生命周期延长,直到引用它为止。不,实际上不是。因此,无论是否为const,您都可以使用普通对象初始化引用。