Какие элементы управления прерываются перед функцией-членом объекта в формате clang?

Это часть кода C++, которую я хочу отформатировать с помощью инструмента clang-format (версия 7.0.0).

template <typename Fn>
void AsyncAPI::init_write(std::string const& data, Fn&& callback)
{
    errorcode injected(injected_);
    injected_ = 0;

    if (!injected) { data_ = data; }
    std::thread([injected, callback = std::forward<Fn>(callback)]() mutable {
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
        callback(injected);
    })
        .detach();
}

Функция-член detach() для this_thread каким-то образом перемещается на новую строку. Как я могу переместить его на одну строку вверх, чтобы он выглядел

std::thread([]() {
/*
*/
}).detach();

Меня вполне устраивают текущие настройки, поэтому я надеюсь, что изменения не будут слишком радикальными. Я попробовал предопределенные стили формата, предоставленные clang-format (Google, LLVM), ни один из них не смог поднять detach вверх.

Мой конфигурационный файл в формате clang:

---
Language:        Cpp
AccessModifierOffset: -4
AlignAfterOpenBracket: false
AlignConsecutiveAssignments: true
AlignConsecutiveDeclarations: true
AlignEscapedNewlines: Left
AlignOperands:   true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: true
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: true
AllowShortIfStatementsOnASingleLine: true
AllowShortLoopsOnASingleLine: true
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: false
BinPackParameters: false
BreakBeforeBinaryOperators: All
BreakBeforeBraces: Custom
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeComma
BreakInheritanceList: BeforeComma
BraceWrapping:
  AfterClass: true
  AfterControlStatement: true
  AfterFunction: true
  AfterNamespace: true
  AfterStruct: true
  AfterUnion: true
  BeforeCatch: true
  BeforeElse: false
  SplitEmptyFunction: true
BreakStringLiterals: true
ColumnLimit:     80
CommentPragmas:  '^ IWYU pragma:'
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: false
DerivePointerAlignment: false
DisableFormat:   false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:   [ foreach, Q_FOREACH, BOOST_FOREACH ]
IncludeBlocks: Regroup
IndentCaseLabels: false
IndentWidth:     4
IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd:   ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: Inner
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Left
SpaceAfterCStyleCast: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles:  false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard:        Cpp11
TabWidth:        4
UseTab:          Never
...

person JohnKoch    schedule 01.11.2018    source источник


Ответы (1)


Похоже, что-то сломалось в clang-format версии 5.0.0 и было исправлено в версии 10.0.0 (проверено с помощью конфигуратор). Поэтому лучше всего перейти на clang-format версию 10.0.0 или более позднюю.

person Eric Backus    schedule 26.08.2020