Аргументы по умолчанию должны быть связаны во время компиляции — почему?

Почему C ++ был разработан так? …

(Этот вопрос отличается, но тесно связан с

Невозможно: этот указатель в качестве аргумента по умолчанию. Зачем? )

4

Решение

На самом деле, это не совсем точно. Ограничения:

8.3.6 Аргументы по умолчанию [dcl.fct.default]

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), который не является константой времени компиляции. Это пример прямо из стандарта.

Причины, по которым это так, обычны: либо предложения не было, либо оно было отклонено, признано ненужным или слишком сложным для реализации.

11

Другие решения

Аргументы по умолчанию — это значения параметра, которые должны использоваться в теле функции. Значение этой переменной (т.е. параметра) может быть переопределено в зависимости от того, как вызывается функция. Но в то время как его нет — аргумент по умолчанию является значение к этой переменной — и значение должно быть определено. Если это значение должно быть динамическим — не быть связанным во время компиляции — тогда, возможно, лучше использовать отдельную функцию для вычисления этого значения и, по-видимому, не вписывается в 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
}

Это заставляет программиста писать лучший код, который, скорее всего, того стоит в долгосрочной перспективе.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector