Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用clang格式保留用作函数中间参数的短lambda_C++_Lambda_Clang Format - Fatal编程技术网

C++ 使用clang格式保留用作函数中间参数的短lambda

C++ 使用clang格式保留用作函数中间参数的短lambda,c++,lambda,clang-format,C++,Lambda,Clang Format,我想用clang格式格式化代码,并保留lambda作为中间函数参数的原样(原样): 我在clang格式9.0(以及11.0.0-2663a25f)中尝试的所有内容都将参数包装到下一行,即: void f() { func( 0, [] {}, 0); // not-ok } 如果没有第一个或/和最后一个参数,即使内置的-style='WebKit'选项也会给出所需的结果: void f() { func([] {}, 0); // ok func(0,

我想用clang格式格式化代码,并保留lambda作为中间函数参数的原样(原样):

我在clang格式9.0(以及11.0.0-2663a25f)中尝试的所有内容都将参数包装到下一行,即:

void f()
{
    func(
        0, [] {}, 0); // not-ok
}
如果没有第一个或/和最后一个参数,即使内置的
-style='WebKit'
选项也会给出所需的结果:

void f()
{
    func([] {}, 0); // ok
    func(0, [] {}); // ok 
    func([] {});    // ok 
}
自从LLVM8.0以来,似乎有些东西改变了(坏了),因为7.1可以根据需要工作。I.e.给我的和我原来的一样:

void f()
{
    func(0, [] {}, 0); // how to achieve this after clang-format?
}

最新版本的
clangformat
(即10)具有特定于格式化lambda的配置选项。具体来说,可以通过将值
SLS\u Inline
分配给配置指令
AllowShortLambdasOnASingleLine
来实现您的要求

以下是从中提供的其他选项:

允许短跑单行
(短跑风格)

根据该值,可以将自动lambda{return 0;}放在一行上

可能值:

SLS\u None
(配置中:None)从不将lambda合并到一行中

SLS\u Empty
(配置中:Empty)仅合并空lambda

SLS\u Inline
(在配置中:Inline)将lambda合并为一行函数的if参数

llvm8
附带的
clangformat
上,我没有找到同样的方法。我找到的最接近的配置如下

clang-format -style={BasedOnStyle: WebKit, AllowShortFunctionsOnASingleLine: true,  AllowShortBlocksOnASingleLine: true}
无论如何,它无法满足您的全部请求,这是我的Windows笔记本电脑上的外观:

void f() {
  func([this] { return false; },
       this);                           // ok
  func(this, [this] { return false; }); // ok
  func([this] { return false; });       // ok
}

//clangformat off
?@SergeyA:)off不是一个选项,因为我通常需要列限制。顺便说一句,要触发此错误,您只需要以下内容:
func(0,[]{},0)好的,我在这里报告了:我今天也遇到了这个问题。Bugzilla报告了另外两次:45424和28546。似乎什么也没有发生。仅供参考:
AllowShortLambdasOnASingleLine
即使在
clang格式9.0.0
中也可用。我的问题的主要问题是使用lambda作为函数的中间参数。我在你的代码中没有看到任何关于这种情况的例子。@αλεχολΓτ正如你可能看到的那样,我的答案的第二个代码块中的
排序
函数调用使用
短lambda
作为第三个参数。我不知道中间参数(即三参数函数中的第二个参数)和其他参数之间有什么区别;除非另有规定,否则将以同样的方式对待他们。这也在文档中明确说明了
BinPackArguments
configuration选项,该选项在函数调用站点执行参数对齐,要么全部在同一行上,要么每个都在自己的行上。是的,这不是一个解决方案。问题实际上是上面提到的叮当声格式的bug。
auto lambda = [](int a) {
    return a;
};
sort(a.begin(), a.end(), ()[] { return x < y; })
auto lambda = [](int a) {}
auto lambda2 = [](int a) { return a; };
clang-format -style={BasedOnStyle: WebKit, AllowShortFunctionsOnASingleLine: true,  AllowShortBlocksOnASingleLine: true}
void f() {
  func([this] { return false; },
       this);                           // ok
  func(this, [this] { return false; }); // ok
  func([this] { return false; });       // ok
}