11

重複の可能性:
括弧の空のセットを使用して引数なしでコンストラクターを呼び出すとエラーになるのはなぜですか?

このコードを持ってみましょう

class Foo {
  Foo(int) { }
};

次に、結果があります。

int main() {
  Foo f1 = Foo(5); // 1: OK, explicit call
  Foo f2(5); // 2: OK, implicit call
  Foo f3(); // 3: no error, "f3 is a non-class type Foo()", how so?
  Foo f4(f1); // 4: OK, implicit call to default copy constructor
  Foo f5; // 5: expected error: empty constructor missing
}

ケース3で何が起こっているのか説明できますか?

4

6 に答える 6

12

3 行目は、引数を取らず、 を返す関数の宣言として解析されますFoo

于 2011-12-12T14:32:05.277 に答える
8

Foo f3();f3戻り型が。の、という関数を宣言しますFoo

于 2011-12-12T14:32:12.500 に答える
5

C ++には、ステートメントを関数宣言として解釈できる場合、このように解釈されるという規則があります。

したがって、構文Foo f3();は実際には引数をとらずにを返す関数を宣言します Foo。これを回避するには、を記述Foo f3;します。デフォルトのコンストラクターも呼び出されます(もちろん、コンストラクターがある場合)。

于 2011-12-12T14:33:23.773 に答える
4
  • f1明示的な呼び出しの後にコピーコンストラクターを呼び出します、これは間違っていました
  • f2明示的なコンストラクター呼び出しです//ここでも間違っていました
  • f3関数を宣言します
  • f4f1//あなたはここにいます
  • f5デフォルトのコンストラクターを呼び出します//あなたは再びここにいます
于 2011-12-12T14:33:43.257 に答える
3

これはあなたが思っているものではありません:

 Foo f3();

これはデフォルト コンストラクターの明示的な呼び出しだと思うかもしれませんが、そうではありません。実際にはf3、パラメーターをとらず、Fooby 値を返すという名前の関数の宣言です。

これがコンストラクター呼び出しではなく関数宣言として解析されることは、Most Vexing Parseとして知られています。

于 2011-12-12T14:35:11.400 に答える
2

ケース3でfooを返すf3という関数を定義しました。ケース5では、デフォルトのコンストラクターが定義されていないため、エラーが発生します。

于 2011-12-12T14:33:02.847 に答える