Существует возможность добавить или переопределить аргументы функции по умолчанию в C ++. Давайте посмотрим на пример:
void foo(int a, int b, int c = -1) {
std::cout << "foo(" << a << ", " << b << ", " << c << ")\n";
}
int main() {
foo(1, 2); // output: foo(1, 2, -1)
// void foo(int a, int b = 0, int c);
// error: does not use default from surrounding scope
void foo(int a, int b, int c = 30);
foo(1, 2); // output: foo(1, 2, 30)
// void foo(int a, int b, int c = 35);
// error: we cannot redefine the argument in the same scope
// has a default argument for c from a previous declaration
void foo(int a, int b = 20, int c);
foo(1); // output: foo(1, 20, 30)
void foo(int a = 10, int b, int c);
foo(); // output: foo(10, 20, 30)
{
// in inner scopes we can completely redefine them
void foo(int a, int b = 4, int c = 8);
foo(2); // output: foo(2, 4, 8)
}
return 0;
}
Онлайн версия для игры с: http://ideone.com/vdfs3t
Эти возможности регулируются стандартом в 8.3.6. Более конкретные детали в 8.3.6 / 4
Для не шаблонных функций аргументы по умолчанию могут быть добавлены позже
объявления функции в той же области видимости. Объявления в
разные области имеют совершенно разные наборы аргументов по умолчанию.
То есть объявления во внутренних областях не получают аргументы по умолчанию
из деклараций во внешних областях и наоборот. В данной функции
декларация, каждый параметр после параметра со значением по умолчанию
Аргумент должен иметь аргумент по умолчанию, предоставленный в этом или предыдущем
объявление или должен быть пакетом параметров функции. Аргумент по умолчанию
не должно быть переопределено более поздним объявлением (даже к тому же
значение)
…
Честно говоря, я никогда не использую эту функцию при кодировании на c ++. Я использовал подобные фрагменты кода несколько раз, чтобы удивить своих коллег, но, конечно, не в рабочем коде. Таким образом, возникает вопрос: знаете ли вы реальные примеры кода, которые используют эти функции с преимуществами?
Если вы не можете изменить какой-либо существующий код или библиотеку и действительно не можете печатать правильный аргумент, то изменение аргумента по умолчанию для некоторой области может быть решением.
Похоже на то, что этот хак может быть полезен при работе с кодом C ++, сгенерированным каким-либо устаревшим инструментом. Например, если сгенерированный код всегда имел сотни вызовов в какую-либо внешнюю библиотеку, используя аргумент по умолчанию, но теперь аргумент по умолчанию больше не является правильным.
Других решений пока нет …