我很惊讶这个struct
只能明确转换为bool
,在if
语句中运行良好:
struct A
{
explicit operator bool( ) const
{
return m_i % 2 == 0;
}
int m_i;
};
int main()
{
A a{ 10 };
if ( a ) // this is considered explicit
{
bool b = a; // this is considered implicit
// and therefore does not compile
}
return 0;
}
为什么会这样?它在C ++标准中的设计原因是什么? 我个人发现第二次转换比第一次更明确。为了使它更加清晰,我希望编译器强制对两种情况都有以下内容:
int main()
{
A a{ 10 };
if ( (bool)a )
{
bool b = (bool)a;
}
return 0;
}
答案 0 :(得分:2)
§6.4选择语句[stmt.select]
- 作为表达式的条件的值是表达式的值,上下文转换为bool 表示除switch之外的语句;
醇>
§4标准转换[转化]
某些语言结构要求将表达式转换为 布尔值。表达出现在这种情境中的表达式e 要在上下文中转换为bool ,并且只有当前是格式良好的 如果声明
bool t(e);
格式正确,对于一些发明的人来说 临时变量t(8.5)。
因此,if
中条件的表达必须可在上下文中转换为bool
,这意味着允许显式转换。
这种模式最有可能完成,因为if
的条件只能评估为布尔值,所以通过说if(cond)
您明确说明您想要{{1}被评估为布尔值。