Ваш код (упрощенно):
struct X
{
int mem;
void f(int param = mem); //ERROR
};
Вы хотите использовать не статические данные члены в качестве значения по умолчанию для параметра функции члена Первый вопрос, который приходит. на ум: это конкретный instan ce класса по умолчанию 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++ не указывается порядок инициализации аргументов функции. Следовательно, это недопустимо. Его по той же причине, что и стандарт С ++, не допускает даже этого:
int f(int a, int b = a); //§8.3.6/9
Фактически, §8.3.6/9 явно говорит,
По умолчанию аргументы оцениваются каждый времени, когда функция вызывается. Заказ оценки аргументов функции неуказанный. Следовательно, параметры функции не должны использоваться в выражениях по умолчанию, даже если они не оцениваются.
И остальная часть секции интересна для чтения.
Интересная тема связана с аргументами «по умолчанию» (не относящихся к этой теме, хотя):
возможно дубликат [C++ публично наследуется член класса не может быть использован в качестве аргумент по умолчанию] (http://stackoverflow.com/questions/2159538/c-publicly-inherited-class-member-cannot-be-used-as-default-argument) – marcog
@marcog: Хотя я могу согласиться, это несколько связано , но я считаю, что это не дубликат вообще ... –
Это проблема на C++: D –