私のようなほとんどのC++プログラマーは、ある時点で次の間違いを犯しました。
class C { /*...*/ };
int main() {
C c(); // declares a function c taking no arguments returning a C,
// not, as intended by most, an object c of type C initialized
// using the default constructor.
c.foo(); // compiler complains here.
//...
}
エラーは明らかですが、この種のローカル関数宣言には、それができることを除いて、賢明な使用法があるかどうか疑問に思っていました。特に、同じローカル関数を同じように定義する方法がないためです。ブロック; 他の場所で定義する必要があります。
Javaスタイルのローカルクラスは、特に匿名ソートでよく使用する非常に優れた機能だと思います。ローカルのC++クラス(インラインで定義されたメンバー関数を持つことができます)でさえ、いくつかの用途があります。しかし、この定義のないローカル関数宣言は、私には非常に厄介なようです。それは単なるCレガシーですか、それとも私が気付いていないより深いユースケースがありますか?
非信者のための編集:関数ポインタ宣言C c()
ではありません。
このプログラム
int main()
{
void g();
cout << "Hello ";
g();
return 0;
}
void g()
{
cout << "world." << endl;
}
Hello world.
このプログラムを出力します
void fun()
{
cout << "world." << endl;
}
int main()
{
void g();
g = fun;
cout << "Hello ";
g();
return 0;
}
コンパイルされません。gccは文句を言う:
エラー:割り当てで「void()()」を「void()()」に変換できません
コモー:
エラー:式は変更可能な左辺値である必要があります