2013-11-20 113 views
0

C++標準中沒有指出我可以隱式轉換兩次的東西嗎?即如果我的函數需要對象A並且我用對象C調用它,即使C和A之間沒有直接轉換,但是C到B之間以及從B轉換爲A,也不會得到編譯錯誤?在人生的某個時候,儘管這段代碼是合法的,但今天我發現我錯了。C++中的兩階段隱式轉換

class A {}; 

class B { 
    A m_a; 
public: 
    operator A() { return m_a; } 
}; 

class C { 
    B m_b; 
public: 
    operator B() { return m_b; } 
}; 


void f(A a){} 

int main() 
{ 
    C c; 
    f(c); 
    return 0; 
} 
+1

順便說一句,您在類'B'中缺少'operator A' – kfsone

+0

此代碼中沒有**強制轉換**。有**隱式轉換**。強制轉換是您在源代碼中編寫的內容,以告知編譯器進行轉換。 –

回答

1

的隱式轉換隻能涉及單個用戶定義的轉換。在用戶定義的轉換之前和/或之後,它還可以包含內置轉換(例如intlong)。

您的代碼是無效的,因爲它需要兩個用戶定義的轉換,CBA(假設你的意思是說operator ABoperator int)。這樣做有一個很好的理由:爲了允許兩次轉換,編譯器必須嘗試每種可能的中間類型,並且有無數種可能的類型。

順便說一下,這裏沒有涉及到的演員。演員陣容是明確的類型轉換。

+0

因此,如果它們中的一個是內置轉換,它可以是兩階段? – Mehrdad

+0

@Mehrdad:是的,只要轉換是明確的。如果'C'可轉換爲'int'(並且沒有其他整數類型),'f'需要'long',那麼'f(C)'將'C'轉換爲'int'爲'long'沒事的。 –

+0

好的,謝謝你的回覆,現在我明白了,一個用戶定義了一個,另一個用戶定義了 – e271p314

1

既然你要轉換CA,轉換運營商實際需要的是A,不B.你得到一個B,但它並沒有澆注變成一個A。但是,將B作爲A返回將執行隱式轉換。

class C { 
    B m_b; 
public: 
    operator A() { return m_b; } 
}; 

Live example

+0

好的,我明白了,隱式轉換正在返回一種類型的對象,而運算符的返回類型不同 – e271p314