Зачем определять лямбда-функцию, которая возвращает структуру вместо определения структуры напрямую? - PullRequest
3 голосов
/ 28 апреля 2019

Я видел некоторый код, который в основном делает это:

struct A {
  int a;
  int b;
};

static A default_a = []() {
  A ret;
  ret.a = 1;
  ret.b = 2;
  return ret;
}();

Почему он написан таким образом?Я бы просто написал:

static A default_a {
  .a = 1,
  .b = 2,
};

Любой из них предпочтителен?

Ответы [ 3 ]

0 голосов
/ 28 апреля 2019

Это можно сделать, когда инициализация структуры более сложна, чем просто установка членов для констант времени компиляции.Возможно, вы читаете материал из файла или получаете дескриптор ресурса GPU.Я лично предпочитаю написать функцию, которая инициализирует объект, потому что функция имеет описательное имя и может быть использована повторно.Я никогда не использовал этот лямбда-паттерн.Для показанного вами примера лучший способ инициализации default_A был бы следующим:

static A default_a = {1, 2};

Назначенные инициализаторы - это функция C ++ 20.

0 голосов
/ 28 апреля 2019

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

0 голосов
/ 28 апреля 2019

Инициализация структуры в статическое время с начальными значениями (как во втором примере) отлично подходит для тривиальных значений, однако, если вам нужно запустить нетривиальные инициализации (и не иметь конструктора), лямбда-подход работает,Например, что если вам нужно инициализировать поля с помощью функции, которая возвращает данные с параметром «out»?

До существования лямбда-выражений вам нужно было бы создать явную функцию инициализации и использовать ее.инициализировать переменные (это, конечно, то, что представляет собой CTOR), но теперь лямбда-выражения делают этот процесс немного более кратким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...