2013-06-27 88 views
0

我遇到過一個例子(對於一個簡單的函數 - 嘗試塊),從中似乎利用了C++語法中較模糊的方面之一(像大多數模糊的方面語言)我似乎無法找到文檔。C++冒號語法與函數體

我已經搜查了谷歌也沒有用,所有的搜索返回的(而不是無用的)僅適用於構造函數初始化(這我很熟悉的),但我想知道的是body:handler:的重要性報表此構造塊:

class foo{ 
    foo() try 
    //initalizer list that could throw 
    { 
    body: 
     //do stuff that could possibly throw 
    } catch(std::exception &e) { 
    handler: 
     throw; 
    } 
}; 

原作者突然增加了這個語法只舉一個例子,我想知道這種語言結構

+2

這是一個標籤,你可以'goto'。 –

+0

@ 0x499602D2他在初始化器之前並沒有詢問冒號,他詢問'body:'和'handler:'。 – Barmar

+0

@Barmar對,我的錯 – 0x499602D2

回答

5

XXX:的影響是一個標籤。它在您發佈的代碼中沒有任何功能用途。它可能已被作者列入幫助他們組織代碼。

你可以在goto語句中使用標籤,如goto XXX;跳轉到代碼中的那一點,但我會留給你決定這是一個好的想法還是現在。

1
foo::foo() 
try 
{ 
body: 
    //... do stuff that could possibly throw 
} 
catch(std::exception &e){ 
handler: 
    throw; 
} 

那段代碼有兩個相當不尋常的結構。第一個是你已經指出的,已經在mjk的答案中解釋過了:bodyhandler是標籤。標籤用於goto s,而這又可用於流量控制(確定代碼應繼續執行的位置)。現在,應該很少使用goto,因爲很少有情況下它們不能被其他流量控制(if,for,while,do ...)替代,這會使其更易讀。由於goto很少使用,標籤也很少使用。

第二個有趣的結構是功能級別try塊:

foo::foo() 
try { 
} catch (std::exception const &) { 
} 

注意,有try美中不足的是沒有構造體,但實際上{}。這也是一種罕見的構造。它旨在支持在構造函數中初始化程序列表的評估期間捕獲異常(在上面的代碼中是隱式的)。如果類型有一個基類,或者構造函數可能拋出的成員,那麼構造函數的主體將永遠不會被評估,並且常規的try-catch將不會有用於處理該異常。函數級別的try塊也包含初始化器列表,並且會在評估不同子成員的構造函數時捕獲拋出的任何異常。這是一個很少使用的構造,因爲在catch塊中你確實做得不多。已經或尚未構建的確切狀態是未知的,並且不能被驗證,所以唯一可能的用途是重新引發相同的異常或不同的異常。在一個更完整的例子中的語法是:

T::T() 
try 
    : base1(args), base2(), member1(), member2() //... 
{ 
    // body 
} catch (exception1 const& ex1) { 
    // ... 
    throw; // rethrow same exception 
} catch (exception2 const& ex2) { 
    // ... 
    throw different_exception(); 
}