我有一个关于 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++ 有效。
恐怕这是不可能的。如果我猜的话,该工具首先检查您是否允许短 lambda,然后注意到它不适合一行,因此它应用
BraceWrapping: BeforeLambdaBody
并满意,因为现在所有内容都在列限制内。
如果在这种情况下你可以牺牲奥尔曼的风格,
BraceWrapping: BeforeLambdaBody
设置为false
将导致
const auto mediumLambda = [some, args, here](More arguments) {
return doSomething(some, args, here, arguments);
};
同时将短 lambda 保持在一行并中断结尾
};
(如果不可能将其保留在一行中)。
它可能是也可能不是一个错误,但肯定值得填写错误票以更改此行为或改进文档,解释该工具在这种特殊情况下的作用。