Функция dummy() - что это должно быть?
Итак, вчера я прочитал этот вопрос здесь о SO и наткнулся на лучший проголосовавший ответ, который использовал такой код, чтобы вызвать лямбда рекурсивно
std::function<void(int)>
f {[&f](int i){
// do something
}},
dummy((f(3), nullptr));
Я задавался вопросом, что такое часть dummy(...)
, поэтому я провел некоторое исследование, но ничего не смог найти. В фрагменте кода, указанном в ответе, был заголовок <utility>
, поэтому я предполагаю, что вещь должна быть объявлена где-то там, но я все еще ничего не мог найти об этом.
Может ли кто-нибудь объяснить, что делает эта функция dummy
(или функтор), где она объявлена и для чего она обычно используется?
Я имею в виду, очевидно, что в примере он используется для вызова функции f. Но какова его фактическая цель?
ПРИМЕЧАНИЕ. Я знаю, что этот вопрос немного широк, но поскольку я не мог найти никакой информации об этом, я не мог сосредоточить этот вопрос на одной конкретной проблеме. Также я надеюсь, что ответ на мои вопросы поможет другим найти информацию о таинственном dummy()
.
Ответы
Ответ 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
можно вызвать в том же самом объявлении, что и в связанном вопросе. Решение глупо, но, возможно, это желание.