Почему переменные-члены не могут использоваться в качестве значений по умолчанию для параметров?

Возможный дубликат:
Нестатический член в качестве аргумента по умолчанию для нестатической функции-члена

Поправьте меня, если я ошибаюсь, но я думаю, что параметры по умолчанию работают так:

Когда компилятор видит вызов функции, он начинает помещать параметры в стек. Когда у него заканчиваются параметры, он начинает помещать значения по умолчанию в стек до тех пор, пока все обязательные параметры не будут заполнены (я знаю, что это упрощение, поскольку параметры фактически передаются справа налево, поэтому он будет начинаться со значений по умолчанию, но Идея такая же).

Если это так, почему переменные-члены не могут использоваться как значения по умолчанию? Мне кажется, что, поскольку компилятор обычно проталкивает их на сайт вызова, он должен быть в состоянии разрешить их просто отлично!

РЕДАКТИРОВАТЬ Поскольку, судя по ответам, мой вопрос был неправильно понят, позвольте мне уточнить. Я знаю, что это так, и я знаю, что является и не допускается языком. Мой вопрос заключается в том, почему разработчики языка решили не допустить этого, так как это, кажется, естественно работает.

6

Решение

Суть того, что вы спрашиваете, может быть отражена в этом простом примере.

void foo(int a, int b = a);

Это не разрешено в C ++. C ++ не позволяет аргументам по умолчанию зависеть от других параметров.

Использование членов класса в качестве аргументов по умолчанию является лишь частным случаем выше, так как доступ к членам класса осуществляется через this указатель и this Указатель — это просто еще один скрытый параметр каждой нестатической функции-члена.

Итак, вопрос действительно почему

void foo(int a, int b = a);

не допускается.

Одна очевидная потенциальная причина запретить это — то, что это наложило бы дополнительные требования к порядку оценки аргумента. Как вы знаете, в C ++ порядок вычисления аргументов функции не определен — компилятор может оценивать аргументы в любом порядке. Однако для поддержки вышеуказанной функциональности аргументов по умолчанию компилятор должен убедиться, что a оценивается раньше b, Это похоже на чрезмерное требование, которое ограничивает типичный порядок оценки свободы, который мы привыкли видеть в C ++.

Обратите внимание, что это

int a;

void foo(int b = a);

разрешено в C ++. И, очевидно, это не демонстрирует вышеупомянутый порядок оценки вопроса.

4

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

Я считаю, что это наиболее подходящие абзацы из стандарта, особенно § 9:

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

§7 Локальные переменные не должны использоваться в аргументе по умолчанию

§9 […] Аналогично, нестатический член не должен использоваться в аргументе по умолчанию, даже если он не оценивается, если только он не отображается как id-выражение выражения доступа к члену класса (5.2.5) или если только он не используется для формирования указателя на член (5.3.1).

1

В этом посте перечислены все способы установки параметров по умолчанию — Должны ли параметры функции по умолчанию быть постоянными в C ++?

Это не сложно обойти вашу потребность.

class A
{
int a;
public:
void f(int i);

void f()
{
f(a);
}
};

дает вам то, что вы хотите.

1

Резюмируя Наваз отличный ответ в связанном вопросе: призыв к void Foo::Bar(int a = this->member) действительно означает void Foo__Bar(Foo* this, int a = this->member), Очевидно, что второй аргумент не может быть оценен до первого, что нарушает аксиому C ++, согласно которой компиляторы могут оценивать аргументы в любом порядке, который им нравится.

1
По вопросам рекламы [email protected]