我有这个MFC代码:
bool SomeBooleanValue;
...
m_ComboBox.ResetContent();
m_ComboBox.AddString("String1");
m_ComboBox.AddString("String2");
m_ComboBox.SetCurSel(SomeBooleanValue);
其中m_ComboBox是CComboBox对象。有时当在CComboBox :: SetCurSel功能中SomeBooleanValue为真而不是1时,我在调试期间看到值252:
_AFXWIN_INLINE int CComboBox::SetCurSel(int nSelect)// here nSelect = 252!
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, CB_SETCURSEL, nSelect, 0); }
据我所知,C ++标准说:
bool类型的rvalue可以转换为int类型的rvalue,false变为零,true变为1。
为什么会发生这种情况?
答案 0 :(得分:2)
标准的正确措辞是§4.7/ p4积分转换[conv.integral]:
如果目的地类型是bool,请参阅4.12。如果源类型是bool, 值false将转换为零,并转换值true 一个。
所以是的,例外行为是bool
如果其值为false
则转换为零,如果其值为真则转换为1。
同样来自§3.9.1/ p6基本类型[basic.fundamental]:
bool类型的值为true或false。
但请注意[49]警告我们:
49)以本国际描述的方式使用bool值 标准为“未定义”,例如通过检查a的值 未初始化的自动对象,可能会使其行为就像它一样 既不真实也不虚假。
也就是说,如果不初始化布尔值,则初始值将是未知的(即,任意)。因此,您将标准描述为“未定义”的行为。
答案 1 :(得分:1)
获得此行为的唯一机会是: