如何防止短 lambda 被分成两行?

问题描述 投票:0回答:1

我有一个关于 C++ lambda 的 clang 格式问题。升级到 Clang-Format 15.0.1 后,我注意到短的但不是在线 lambda 的新行为。下面我将它们称为“双行 lambda”。例子:

单行 lambda

// good/unchanged
auto shortLambda= []() { doSomething(); };

两行 lambda:

// unwanted/new behavior
const auto mediumLambda = [some, args, here](More arguments)
{ return doSomething(some, args, here, arguments); };

多行 Lambda:

// good/unchanged
const auto longLambda= [some, args, here](Are here)
{
   auto result =doSomething(some, args, here, arguments); 
   return result;
};

两行 lambda 的期望行为:

// desired
const auto mediumLambda = [some, args, here](More arguments)
{
   return doSomething(some, args, here, arguments); 
};

理性:“两行”if 语句没有被粉碎在两行上

// Good/unchanged
if (condition)
{
   doWhatever();
}

// Bad/unconfigured:
if (condition)
{ doWhatever(); }

我可以通过设置

AllowShortLambdasOnASingleLine : None
使所有 lambda 成为多行表达式 - 但我确实希望能够适合一行的 lambda 适合一行。

如何避免“两行 lambda”?

相关配置:

# Basic
Language : Cpp
Standard : c++20
ColumnLimit : '110'

# Tabs
TabWidth : '3'
IndentWidth : '3'
UseTab : Never

# Braces/Parens (Allman style)
BreakBeforeBraces : Custom
BraceWrapping:
  AfterCaseLabel:  true
  AfterClass:      true
  AfterControlStatement: true
  AfterEnum:       true
  AfterFunction:   true
  AfterNamespace:  true
  AfterObjCDeclaration: true
  AfterStruct:     true
  AfterUnion:      true
  AfterExternBlock: true
  BeforeCatch:     true
  BeforeElse:      true
  BeforeLambdaBody: true
  IndentBraces:    false
  SplitEmptyFunction: true
  SplitEmptyRecord: true
  SplitEmptyNamespace: true
Cpp11BracedListStyle : true
SpaceBeforeParens : ControlStatements
SpacesInParentheses  : false
SpaceInEmptyParentheses : false


# Functions
AlignAfterOpenBracket : Align
AllowShortBlocksOnASingleLine : false
AllowShortFunctionsOnASingleLine : Inline
BinPackArguments : true
BinPackParameters  : true
AllowAllParametersOfDeclarationOnNextLine : true
IndentWrappedFunctionNames : false
AlwaysBreakAfterReturnType : None
AlwaysBreakAfterDefinitionReturnType : None

# Lambdas
AllowShortLambdasOnASingleLine : All

编辑:添加分号以使 C++ 有效。

c++ lambda clang-format
1个回答
0
投票

恐怕这是不可能的。如果我猜的话,该工具首先检查您是否允许短 lambda,然后注意到它不适合一行,因此它应用

BraceWrapping: BeforeLambdaBody
并满意,因为现在所有内容都在列限制内。

如果在这种情况下你可以牺牲奥尔曼的风格,

BraceWrapping: BeforeLambdaBody
设置为
false
将导致

const auto mediumLambda = [some, args, here](More arguments) { 
    return doSomething(some, args, here, arguments); 
};

同时将短 lambda 保持在一行并中断结尾

};
(如果不可能将其保留在一行中)。


它可能是也可能不是一个错误,但肯定值得填写错误票以更改此行为或改进文档,解释该工具在这种特殊情况下的作用。

© www.soinside.com 2019 - 2024. All rights reserved.