2016-05-03 42 views
8

閱讀this後,我試圖使這種轉換與static_cast的static_cast轉換構造VS轉換操作符

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調用構造函數而不是運算符。爲什麼?

回答

7

的C++標準11說(重點煤礦)(使用gcc 4.8.1與pedanticWall標誌編譯):

5.2.9靜態澆鑄

4否則,可以使用static_cast<T>(e)形式的static_cast將表達式e明確轉換爲類型T,如果聲明T t(e);是格式良好的,對於一些發明的臨時變量t(8.5)。這種顯式轉換的效果與執行聲明和初始化相同,然後使用臨時變量作爲轉換的結果。表達式e被用作glvalue當且僅當初始化使用它作爲glvalue。

5否則,static_cast應執行下列轉換之一。不得使用static_cast明確執行其他轉換。

這解釋了爲什麼在static_cast

B c = static_cast<B>(a); 

結束調用的B構造。

僅當T t(e)格式不正確時才使用轉換運算符。

+0

我明白,這句話意味着如果'B臨時(一)'是有效的'static_cast'可以執行,但我不明白爲什麼構造函數優先。 – PcAF

+0

@PcAF,我找不到一個說'static_cast'可以使用轉換運算符執行的子句。但是,如果有一個,則優先級低於上述優先級。 –

+0

@R Sahu刪除'B(const A&)'轉換構造函數,現在'static_cast'與轉換運算符一起工作。 – PcAF