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