9

この質問に取り組んでいると、一貫性のない動作が見つかりました。

コンストラクターで参照バインディングの動作が一般的な関数と異なるのはなぜですか?

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++0x拡張機能を無効にしてg++-4.1とComeau4.2.45.2を使用してC++03でテストしました。同じ結果が得られました。

C ++ 0xの場合、g++-4.4およびComeau4.3.9をリラックスモードで使用し、C++0x拡張機能を有効にしてテストしました。同じ結果が得られました。

4

1 に答える 1

16
A a(B());

は、Aを返し、引数なしで関数へのポインタを取り、Bを返すという名前の関数の宣言です 。ここを参照してください。括弧を追加すると、予期したエラーが発生します。

A a((B()));
于 2009-08-21T08:44:19.003 に答える