メンバー機能:
void display(int l=this->length)
概念的にはこれと同等です。
void display(A * this, int l=this->length); //translated by the compiler
つまり、§8.3.6/ 9(C ++ 03)が言うように、C++では許可されていない他のパラメーターのデフォルト引数である式で1つのパラメーターを使用しています。
デフォルトの引数は、関数が呼び出されるたびに評価されます。関数の引数の評価の順序は指定されていません。したがって、関数のパラメータは、評価されない場合でも、デフォルトの引数式で使用されないものとします。
C++ではこれが許可されていないことに注意してください。
int f(int a, int b = a); //illegal : §8.3.6/9
解決策は、次のようにパラメータをとらない1つのオーバーロードを追加することです。
void display()
{
display(length); //call the other one!
}
もう1つの関数を追加したくない場合は、パラメーターに不可能なデフォルト値を選択してください。たとえば、負になることのない長さ-1
を記述しているため、デフォルト値として選択し、関数を次のように実装できます。
void display(int l = -1)
{
if ( l <= -1 )
l = length; //use it as default value!
//start using l
}