С++: добавление и переопределение аргументов по умолчанию в реальном мире

Существует возможность добавить или переопределить аргументы по умолчанию для функции в С++. Рассмотрим пример:

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

Для функций без шаблона аргументы по умолчанию могут быть добавлены позже объявления функции в той же области. Объявления в у разных областей есть совершенно разные наборы аргументов по умолчанию. То есть объявления во внутренних областях не принимают аргументы по умолчанию из деклараций во внешних областях и наоборот. В данной функции объявление, каждый параметр, следующий за параметром со значением по умолчанию аргумент должен иметь аргумент по умолчанию, указанный в этом или предыдущем объявление или должен быть пакетом параметров функции. Аргумент по умолчанию не должны быть переопределены более поздним выражением (даже не к тому же стоимость)...

Честно говоря, я никогда не использую эту функцию при кодировании в С++. Несколько раз я использовал подобные фрагменты кода, чтобы удивить своих коллег, но, конечно, не в производственном коде. Таким образом, возникает вопрос: знаете ли вы примеры реального мира кода, которые используют эти функции с выгодами?

Ответы

Ответ 1

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

Похоже, что этот хак может быть полезен при работе с кодом С++, созданным каким-то унаследованным инструментом. Например, если сгенерированный код всегда имел сотни вызовов в какую-либо внешнюю библиотеку, используя аргумент по умолчанию, но теперь аргумент по умолчанию больше не правильный.