なぜC++はこのように設計されたのですか?...
(この質問は異なりますが、密接に関連しています
実際、それは完全に正確ではありません。制限は次のとおりです。
7)ローカル変数はデフォルトの引数で使用されません。[ 例:
void f() {
int i;
extern void g(int x = i); //error
// ...
}
—例を終了]
8)キーワード
this
は、メンバー関数のデフォルトの引数では使用できません。[ 例:
class A {
void f(A* p = this) { } // error
};
したがって、this
ローカル変数をデフォルトとして使用することはできません。
たとえば、次のようになります。
int a = 1;
int f(int);
int g(int x = f(a)); // default argument: f(::a)
void h() {
a = 2;
{
int a = 3;
g(); // g(f(::a))
}
}
g
f(2)
コンパイル時定数ではない値で呼び出されます。これは、標準から直接の例です。
このような理由はいつものことです。提案がなかったか、拒否されたか、必要ないと見なされたか、実装が難しすぎたためです。
デフォルトの引数は、関数の本体で使用されるパラメーターの値です。この変数 (つまりパラメーター) の値は、関数の呼び出し方法に応じてオーバーライドされる場合があります。しかし、そうではありませんが、デフォルトの引数はこの変数の値であり、値を定義する必要があります。この値が動的である必要がある場合 (コンパイル時にバインドされないようにする必要がある場合)、その値を計算するには別の関数を使用する方が適切であり、このdefault
分野には適していないようです。また、そのようなシナリオに対して、C++ には既に適切なメカニズムがあります。つまりPolymorphism
、関数のオーバーロードです。
Fn
これを考慮してください:関数をparamで呼び出す必要があるか、v
そうでない場合はデフォルトでFn(x)
ここv
に設定され、x
変数である必要があります。
デフォルトのパラメーターを持たなければならない代わりに、これは関数のオーバーロードを使用して簡単に実装できます。
BOOL x;
VOID Fn(BOOL v)
{
...
}
VOID Fn()
{
Fn(::x);
}
VOID Main()
{
::x = ...; // Variable x's value is altered
Fn(FALSE);
Fn(); // Param value defaults to value of x
}
これにより、プログラマーは、長期的に見れば価値のあるより良いコードを書く必要があります。