Почему 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
либо с параметром 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
}
Это заставляет программиста писать лучший код, который, скорее всего, того стоит в долгосрочной перспективе.