为什么我无法在开关盒区块中初始化一个变量
这个问题在这里已经有了答案:
该case
在语句switch()
具有相同的语义goto
:当你派遣一个标签switch
- case
,您可以有效地goto
的case
标签。 原因是switch
案件中的case
不是独立的。 你可以从一个案件到另一个案件。
事实上, switch
case
goto
,你甚至可以写一个怪物,比如Duff's Device。 研究,直到你被吓坏了。
在C ++中,本地定义的对象在它们的定义点处进入作用域,并在封闭范围的结束大括号之外超出范围。 保证退出该范围的break
或continue
语句可以清楚地处理超出范围的对象。
对于switch
语句,封闭范围由switch()
后的花括号定义。
现在,在C ++中,使用goto
或类似的东西来跳过对象初始化是非法的。 在您的示例中, case
和default
标签与该规则相违背。
您的修补程序通过用对象分配替换对象初始化来避免此问题。 这是修复它的一种方法。 另一个是增加一个额外的范围:
case WM_LBUTTONDOWN:
{
HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0));
break;
}
这很有效,因为大括号提供了一个额外的范围,清楚地定义hBrush
的生命周期何时结束。
在技术细节方面:触发错误的语句依赖于复制构造函数。 该声明不依赖于复制分配操作符。
退休忍者:你可以,你只需要把块放在{}
user3116182:是的,我知道那种方式
@ user3116182:为什么你打扰它?
如果没有作用域声明的变量,则通过大小写块落入的麻烦将消除歧义,或跳过变量初始化。 就是这样。
链接地址: http://www.djcxy.com/p/14787.html上一篇: Why I can't initialize a variable in switch case block
下一篇: Why do my switch cases sometime need braces in Objective