首页 > 解决方案 > 如何使clang-format 11在可变参数模板声明后放置一个空格

问题描述

我不确定发生了什么以及如何准确地描述它。这是源代码

template <typename ...Args>
void foo(Args &&...args)
{
    bar(std::forward<Args>(args)...);
}

我在 Ubuntu 上使用 clang-format 10 的朋友生成了这个

template <typename ... Args>
void foo(Args &&... args)
{
    bar(std::forward<Args>(args)...);
}

但是我在 Arch 上使用相同.clang-format文件的 clang-format 11 生成了以下内容:


template <typename ...Args>
void foo(Args &&...args)
//              ^^^^ Notice the missing space after ...
{
    bar(std::forward<Args>(args)...);
}

我在clang-fotmat 11 的 changelog中没有发现可疑的变化。我错过了什么?

标签: c++clang-format

解决方案


由于我遇到了同样的问题,经过一番git bisect研究,我找到了引入此更改的提交:https ://reviews.llvm.org/D83564

clang 格式不遵守PointerAlignment: Right包装声明符中的省略号

此更改背后的原因是您可以考虑类型 ( ) 或变量 ( ) 的注释&&...部分,或者如果需要,将其放在中间 ( )。此更改旨在防止具有和参数(包)之间的不一致,其格式如下PointerAlignment: LeftPointerAlignment: RightPointerAlignment: Middle&&&&...

template <typename Arg, typename ...Args>
void foo(Arg &&arg, Args &&... args)
{
    bar(std::forward<Args>(args)...);
}

使用较旧的 clang 格式,但像这样

template <typename Arg, typename ...Args>
void foo(Arg &&arg, Args &&...args)
{
    bar(std::forward<Args>(args)...);
}

与最近的一个。


推荐阅读