Ваш код (упрощенно):
struct X
{
int mem;
void f(int param = mem); //ERROR
};
Вы хотите использовать нестатические данные члена в качестве значения по умолчанию для параметра функции-члена.Первый вопрос, который приходит на ум, таков: к какому конкретному экземпляру класса принадлежит значение по умолчанию mem
?
X x1 = {100}; //mem = 100
X x2 = {200}; //mem = 200
x1.f(); //param is 100 or 200? or something else?
Ваш ответ может быть 100
как f()
вызывается для объекта x1
, который имеет mem = 100
.Если это так, то требуется, чтобы реализация реализовала f()
как:
void f(X* this, int param = this->mem);
, что, в свою очередь, требует, чтобы первый аргумент был инициализирован первым до инициализации другого аргумента.Но стандарт C ++ не определяет какой-либо порядок инициализации аргументов функции.Следовательно, это не разрешено.По той же причине, по которой C ++ Standard не допускает даже этого:
int f(int a, int b = a); //§8.3.6/9
Фактически, в §8.3.6 / 9 прямо сказано,
Каждый аргумент по умолчанию оценивается каждыйраз функция вызывается. Порядок вычисления аргументов функции не указан . Следовательно, параметры функции не должны использоваться в выражениях аргументов по умолчанию , даже если они не оцениваются.
А остальная часть раздела представляет интересное чтение.
Интересная тема, связанная с аргументами «по умолчанию» (хотя не относится к этой теме):