2016-07-16 8 views
2

次のコードは、g ++バージョン5.1.0で正常にコンパイルされます。対応するtryのないcatchは、メンバー関数foo::bar()にあります。私はこの構文が合法であったかどうか疑問に思っていました。もともとCatch block in constructor without tryキャッチせずにキャッチを成功

+3

Er ...私が本当にあなたがここに求めているものは、あなたがリンクしている元の質問への答えにはまだ含まれていないでしょう。 – hvd

+0

@hvdオリジナルの質問には私には見えないコメントしかありません。また、構文が対応する 'try'なしで' catch 'を許可する理由についての議論や答えはありません。 –

+3

はい、「未」は未来を指します。質問はまだ答えられていません。私はあなたがここで尋ねていることも含めないで、その質問がどのように答えることができないのか分かりません。 – hvd

答えて

5

あなたが与える例で見

struct foo 
{ 
    void bar() 
    { 
    } 
    catch (...) 
    { 
    } 
}; 

int main() 
{ 
    foo f; 
    f.bar(); 
    return 0; 
} 

struct foo 
{ 
    void bar() 
    { 
    } 
    catch (...) 
    { 
    } 
}; 

…有効な標準C++ではありません。

g ++言語の拡張機能である可能性があります。

あなたがtryキーワードを必要とするも除いて、機能catchブロックのように見えるようにリンクされ問題になっているcatch ES。

+1

fwiw、 'g ++ -std = C++ 14 -Wall -Wextra -Wpedantic'で私のためにコンパイルします。私は愚かな独自の拡張子をすべて無効にします –

+1

' g ++ 'は' bar () 'と' catch 'も文法エラーや警告を生成することなく、 'catch'は' try'なしで実際には何も捕捉しません、そして、そのスコープが前記「試行」によって囲まれている。私はこれが、 'catch 'が対応する関数スコープ' try'を必要としない構文解析の抜け穴であると推測しています。 –

2

他の人がすぐに指摘してくれたように、引用符で囲まれたコードは整形式ではありません。C++。最近のGCC 4/5/6ブランチで使われていた、書き直されたC++パーサーの見落としのために許可されました。

私はこれをGCC Bug/PR c++/71909として提出しました。そこに見られるように、機能ブロックtryブロックがすでに発生している場合にのみ、機能ブロックcatchがブロックされることを確実にするために、すべての3つのブランチに対してコミットが行われました。 3日のターンアラウンド、それはかなり良い:-)

のおかげで、これをもたらすためのリチャード

+0

かなり速いtbhです。 –

関連する問題