大家好!
检查我自己的代码,我发现了这一有趣的行:
const CString &refStr = ( CheckCondition() ) ? _T("foo") : _T("bar");
现在我完全不知所措,不明白为什么它是合法的。据我了解,必须使用右值或左值初始化 const 引用。未初始化的引用不能存在。但 ()?运算符在为引用赋值之前执行 CheckCondition() 函数。我现在可以看到,当执行 CheckCondition() 时, refStr 存在,但仍未初始化。如果 CheckCondition() 抛出异常或使用 goto 语句传递控制会发生什么?它会使引用未初始化还是我遗漏了什么?
你错过了一些东西 - 它是完全合法的代码,事实上,这样的代码是条件运算符最常见和最好的用途之一。认为编译器必须在内部按照代码在页面上布局的顺序执行操作的想法总是错误的 - 它完全可以自由地评估条件运算符(这只是另一个表达式),然后使用结果来执行初始化。
至于 goto,无法在初始化中使用 goto。如果抛出异常,则该引用将被视为从未创建过。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)