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

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

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

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

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

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

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

33

Решение

Давайте немного упростим объявление, используя более простые типы и выражения. Мы будем использовать 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 может быть вызван.

53

Другие решения

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

В декларации, которую вы показываете. Упрощенная:

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

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

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

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

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

18

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector