显式和隐式转换

时间:2017-09-19 09:15:27

标签: c++11 type-conversion implicit-conversion explicit explicit-conversion

我很惊讶这个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;
}

1 个答案:

答案 0 :(得分:2)

  

§6.4选择语句[stmt.select]

     
      
  1. 作为表达式的条件的值是表达式的值,上下文转换为bool 表示除switch之外的语句;
  2.   
  

§4标准转换[转化]

     

某些语言结构要求将表达式转换为   布尔值。表达出现在这种情境中的表达式e   要在上下文中转换为bool ,并且只有当前是格式良好的   如果声明bool t(e);格式正确,对于一些发明的人来说   临时变量t(8.5)。

因此,if中条件的表达必须可在上下文中转换为bool ,这意味着允许显式转换。

这种模式最有可能完成,因为if 的条件只能评估为布尔值,所以通过说if(cond)您明确说明您想要{{1}被评估为布尔值。