Правильный отступ для С++ 11 lambdas

Есть ли принятый "стандартный" способ форматирования лямбда-выражений в С++ >= 11? Особенно, если вставить общие алгоритмы.

Например:

1)

auto it = std::find_if(myVec.begin(),
                       myVec.end(),
                       [id = 42] (const Element& e)
{ return e.id() == id;});

Или 2)

auto it = std::find_if(myVec.begin(),
                       myVec.end(),
                       [id = 42] 
                       (const Element& e)
                       { return e.id() == id;});

Или 3)

auto it = std::find_if(myVec.begin(),
                       myVec.end(),
                       [id = 42] (const Element& e)
                       { 
                           return e.id() == id;
                       });

Или 4)

auto it = std::find_if(myVec.begin(),
                       myVec.end(),
                       [id = 42] (const Element& e)
{ 
    return e.id() == id;
});

Или любая другая комбинация возвратов каретки, пробелов, вкладок... Примечание. Я использую стиль Allman в своем коде, поэтому в идеале он будет "соответствовать одному и тому же стилю".

Ответ 1

Я всегда предпочитал придавать относительные уровни отступа с их собственным семантическим значением и вертикально выравнивать ограничитель закрытия с линией, содержащей соответствующий разделительный разделитель. Это упрощает чтение сложных операторов (например, с лямбда-выражениями в качестве аргументов):

auto it = std::find_if(
  myVec.begin(),
  myVec.end(),
  [id = 42] (const Element& e){ return e.id() == id;}
);

или (если, например, тело лямбда было слишком длинным для одной строки)

auto it = std::find_if(
  myVec.begin(),
  myVec.end(),
  [id = 42] (const Element& e){ 
    return e.id() == id;
  }
);

Ответ 2

Пока нет стандартного способа de jure. Однако вы можете легко использовать свой любимый стиль С++. Например, импровизированный стиль Allman:

        std::for_each(
            m_pages[i].begin() + m_pageSize,
            m_pages[i].end(),
            [this, i, &insertPlace](const CItemRef& item)
            {
                if(!item->IsOK())
                {
                    insertPlace = m_pages[i+1].insert(insertPlace, item);
                }
            }
        );

Это ваш номер (3). Номер (2) можно использовать для однострочных линий.

По моему скромному мнению, (1) и (4) нарушают дух отступов (они не подчеркивают логическую структуру всего лямбда-блока). Я бы не использовал их.

Ответ 3

Лично мне не нравится потраченное пустое поле слева, поэтому мне нравится ставить несколько аргументов с одним дополнительным уровнем стандартного отступа, начиная со следующей строки:

auto it = std::find_if(
    myVec.begin(),
    myVec.end(),
    [id = 42](const Element& e) { return e.id() == id; }
    );

Или, для более длинных lambdas:

auto it = std::find_if(
    myVec.begin(),
    myVec.end(),
    [id = 42](const Element& e) { 
        return e.id() == id; 
    }
    );

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