static_cast转换构造函数与转换运算符

时间:2016-05-03 20:13:14

标签: c++ gcc casting static-cast

阅读this后,我尝试使用static_cast进行转换:

class A;

class B { 
      public: 
         B(){} 

         B(const A&) //conversion constructor
         { 
              cout << "called B's conversion constructor" << endl; 
         } 
};

class A { 
      public: 
         operator B() const //conversion operator
         { 
              cout << "called A's conversion operator" << endl; 
              return B(); 
         } 
};

int main()
{
    A a;

    //Original code, This is ambiguous, 
    //because both operator and constructor have same cv qualification (use -pedantic flag)
    B b = a;

    //Why isn't this ambiguous, Why is conversion constructor called, 
    //if both constructor and  operator have same c-v qualification
    B c = static_cast<B>(a); 
    return 0;
}

我预计它不会编译,因为构造函数和运算符都具有相同的 c-v限定。但是它成功编译并static_cast调用构造函数而不是运算符。为什么?

(使用带有pedanticWall标志的gcc 4.8.1编译)

1 个答案:

答案 0 :(得分:8)

C ++ 11标准说(强调我的):

  

5.2.9静态投射

     

4否则,如果声明{{1},则可以使用e 格式的T将表达式static_cast显式转换为static_cast<T>(e)类型对于一些发明的临时变量T t(e);(8.5),它是格式良好的。这种显式转换的效果与执行声明和初始化,然后使用临时变量作为转换结果相同。当且仅当初始化将它用作glvalue时,表达式t才用作glvalue。

     

5否则,e将执行下面列出的转换之一。不能使用static_cast明确执行其他转换。

这解释了

static_cast的原因
static_cast

最终调用B c = static_cast<B>(a); 的构造函数。

仅当B格式不正确时才使用转换运算符。