プログラム 1:
#include <iostream>
std::string Hello(void){return "Hello";}
std::string World(void){return "world!";}
int main(){
std::cout << Hello() << " " << World() << std::endl;
}
関数 Hello() および World() は、グローバル名前空間に存在します。
これは、宣言の後に続く他の関数から呼び出すことができることを意味します (または、この場合、定義を提供し、最初に宣言する必要はありませんでした)。
これには問題があります。プロジェクトが大きくなるにつれて、グローバル名前空間を多くの関数で埋めるヘッダー ファイルが増えるため、関数シグネチャの競合が発生したり、さらに悪いことに、呼び出されるだけのはずの間違った関数を誤って呼び出したりするリスクがあるためです。別の機能のサブタスクとして。
私は、タスクを機能的にサブタスクに分解するパラダイムに従おうとしているため、特定の関数が別の特定の関数の範囲外で呼び出されることは意味がありません。
ここに回避策があります。インデントの深さのためにコードが読めなくなることは別として、パフォーマンスまたは実装上の落とし穴があるかどうかを知りたいです。現時点ではラムダ関数はちょっとした魔法のようなものなので、予期せぬ危険性に興味があります。
プログラム 2:
#include <iostream>
int main(){
auto Hello = [](void) -> std::string{return "Hello";};
auto World = [](void) -> std::string{return "world!";};
std::cout << Hello() << " " << World() << std::endl;
}
Hello() と World() は main() 内にカプセル化されており、main() のスコープ外から呼び出すことはできません。
違うのはそれだけ?