Подтвердить что ты не робот

Функция dummy() - что это должно быть?

Итак, вчера я прочитал этот вопрос здесь о SO и наткнулся на лучший проголосовавший ответ, который использовал такой код, чтобы вызвать лямбда рекурсивно

std::function<void(int)>
    f {[&f](int i){
        // do something
    }},
    dummy((f(3), nullptr));

Я задавался вопросом, что такое часть dummy(...), поэтому я провел некоторое исследование, но ничего не смог найти. В фрагменте кода, указанном в ответе, был заголовок <utility>, поэтому я предполагаю, что вещь должна быть объявлена ​​где-то там, но я все еще ничего не мог найти об этом.

Может ли кто-нибудь объяснить, что делает эта функция dummy (или функтор), где она объявлена ​​и для чего она обычно используется?

Я имею в виду, очевидно, что в примере он используется для вызова функции f. Но какова его фактическая цель?

ПРИМЕЧАНИЕ. Я знаю, что этот вопрос немного широк, но поскольку я не мог найти никакой информации об этом, я не мог сосредоточить этот вопрос на одной конкретной проблеме. Также я надеюсь, что ответ на мои вопросы поможет другим найти информацию о таинственном dummy().

4b9b3361

Ответ 1

Немного упростите объявление, используя более простые типы и выражения. Мы будем использовать int вместо std::function<void(int)>, 42 вместо лямбда, а f += 1 вместо f(3):

int f{42}, dummy((f += 1, 0));

Чтобы сделать это еще более очевидным, мы можем также использовать скобки вместо круглых скобок для второй инициализации:

int f{42}, dummy{(f += 1, 0)};

Таким образом, это должно быть яснее. Это декларация, которая объявляет две переменные: f и dummy. f инициализируется с помощью 42, а dummy инициализируется с помощью этого выражения: (f += 1, 0). Это, используя оператор запятой, чтобы сначала оценить f += 1, отбросить результат, а затем использовать значение 0 для initalise dummy.

Возвращаясь к полному (несимметричному) объявлению:

Тип обеих переменных f и dummy равен std::function<void(int)>. Сначала f инициализируется лямбдой. Затем dummy инициализируется с использованием выражения для запятой. Левая часть этого выражения f(3) оценивается и забывается. Правая часть, nullptr, затем используется для инициализации dummy. Инициализация a std::function с помощью nullptr приводит к созданию пустого объекта std::function (то же, что и построенный по умолчанию).

Вся цель dummy заключается в том, чтобы ввести дополнительный экстент в той же строке (= в том же объявлении), в котором можно было бы вызвать f.

Ответ 2

где [ dummy] объявлен

В объявлении, которое вы показываете. Упрощенная:

T f /* the declarator */, dummy /* the declarator */;

dummy - это просто имя переменной, как и f. Они оба объявлены в том же объявлении.

Может ли кто-нибудь объяснить, что делает эта фиктивная функция (или функтор)

Я имею в виду, очевидно, что в примере он используется для вызова функции f. Но какова его фактическая цель?

Это фактическая цель. Единственная причина, по которой он объявлен, заключается в том, что f можно вызвать в том же самом объявлении, что и в связанном вопросе. Решение глупо, но, возможно, это желание.