2009-08-21 14 views
9

作業のthis質問、私は矛盾した動作が見つかりました。定数参照先の値へのバインド

参照バインディングがコンストラクタ内で共通の関数と異なる動作をする理由を教えてください。

struct A { 
}; 

struct B : public A { 
    B(){} 
private: 
    B(const B&); 
}; 

void f(const B& b) {} 

int main() { 
    A a(B()); // works 
    A const & a2 = B(); // C++0x: works, C++03: fails 
    f(B()); // C++0x: works, C++03: fails 
} 

私はC++ ++グラムと03のためにそれをテストしている - 厳密C++ 03モードで4.1とコモ4.2.45.2および無効になってC++ 0xの拡張子を持ちます。私は同じ結果を得た。

C++ 0xはg ++ - 4.4とComeau 4.3.9でリラックスモードで、C++ 0x拡張を有効にしてテストされました。私は同じ結果を得た。

答えて

16
A a(B()); 

は、Aを返すとBは hereを見る返す引数なし関数へのポインタを取るという関数の宣言です。 は、括弧を追加し、あなたが期待するエラー取得します:有名な「最も厄介な解析」として知られている

A a((B())); 
+7

を。 – earl

+0

私は誰かに「あなたが最も苦しい解析問題の犠牲者になった」と言うことができる日を待つことができません。もちろん、起きるまでには、私はそれを完全に忘れて、C++を嫌うことに戻ります。 –

関連する問題