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

C中的引用初始化++

  •  1
  • SadSido  · 技术社区  · 17 年前

    大家好!

    在检查我自己的代码时,我发现了这句有趣的话:

    const CString &refStr = ( CheckCondition() ) ? _T("foo") : _T("bar");
    

    现在我完全不知所措,不明白为什么这是合法的。据我所知,const引用必须用r值或l值初始化。未初始化的引用不能存在。但是()?运算符在为引用赋值之前执行CheckCondition()函数。我现在可以看到,在执行CheckCondition()时,refStr存在,但仍未初始化。如果CheckCondition()抛出异常,或者用goto语句传递控制,会发生什么?它会使引用未初始化,还是我遗漏了什么?

    6 回复  |  直到 17 年前
        1
  •  5
  •   MSalters    17 年前

        2
  •  6
  •   anon    17 年前

    const int x = foo();

    这个常数也必须初始化,为此 foo()

    foo() throw ,异常将被捕获 catch() 某处。这 try{} 包围 显然。因此 const int x catch 例外情况下,您的程序(包括

    C++没有随机 goto s他们可以跳进去 foo() 但这并不重要; foo() 仍然需要返回。

        3
  •  3
  •   UncleBens    17 年前

    未初始化的引用不能存在。

    不幸的是,初始化过程中可能会发生一些有趣的事情。你也可以写

    const int& a = foobar(a) ? 1 : 2;
    

    或者就这件事而言

    const int& a = a;
    

    我想当编译器从左向右进行时,a确实在右侧的作用域内,所以 技术上

      const int& a = foobar(a) ? 1 : 2;
                            ^
    

    您的示例很好,因为在初始化之前您不会使用引用。

        4
  •  2
  •   Konrad Rudolph    17 年前

    从语言律师的角度来看,这是错误的。在初始化期间, refStr

    如果初始化过程中的代码导致错误情况,

        5
  •  2
  •   sharptooth    17 年前

        6
  •  0
  •   AProgrammer    17 年前

    一个例外会把你带到一个无法访问refStr的地方,你也不能去一个有refStr来源的地方。如果goto是一个函数,它将无法退出CheckCondition(),如果它是一个宏,你将无法使用goto。longjmp()将具有与异常相同的效果:您将转到无法访问refStr的地方。