C++中的引用初始化

Sad*_*ido 1 c++ reference ternary-operator

大家问候!

检查我自己的代码,我走到了这个有趣的路线:

const CString &refStr = ( CheckCondition() ) ? _T("foo") : _T("bar");
Run Code Online (Sandbox Code Playgroud)

现在我完全不知所措,无法理解为什么它是合法的.据我所知,必须使用r值或l值初始化const引用.未初始化的引用不可存在.但是()?operator在为引用赋值之前执行CheckCondition()函数.我现在可以看到,当执行CheckCondition()时,refStr存在,但仍未初始化.如果CheckCondition()将抛出异常,或使用goto语句传递控件,会发生什么?它是否会使参考文献未初始化或者我遗漏了什么?

小智 6

你遗漏了一些东西 - 它是完全合法的代码,事实上这样的代码是条件运算符最常用和最好的用法之一.认为编译器必须在内部以与代码在页面上布局相同的顺序执行操作总是错误的 - 完全可以自由地评估条件运算符(这只是另一个表达式),然后使用结果执行初始化.

至于goto,在初始化中没有办法使用它.如果抛出异常,则认为引用从未在第一时间创建.


MSa*_*ers 5

更简单的例子: const int x = foo();

这个常数也必须初始化,并且foo()需要调用它.这种情况按照必要的顺序发生:x只有在foo返回时才会存在.

要回答你的其他问题:如果foo()愿意的话throw,异常会被catch()某个地方捕获.那个try{}街区明显catch()包围了const int x = foo();.因此const int x已经超出了范围,并且它从未获得价值是无关紧要的.如果没有catch例外,你的程序(包括const int x)就不见了.

C++没有随机goto的.他们可以跳进去,foo()但这无关紧要; foo()仍然要回来.