为什么 clang-format 会搞砸这段代码?

Wil*_*urn 5 c++ clang clang-format

我的代码库有很多std::variant类型和函数,用于std::visit根据实际类型实现不同的行为。

我正在使用clang-format,有时它会扰乱使用的功能std::visit。我有一个名为 的函数visitor,它从一堆 lambda 表达式中构建一个访问者。看起来,当 lambda 声明返回类型为 时auto&clang-format决定在每个 lambda 的右大括号之后开始换行,将逗号留在左边距。

这是一个示例函数,其clang-format格式如下:

struct A {};
struct B {};
typedef std::variant<A, B> AB;

template <class... Ts>
struct visitor : Ts... {
    using Ts::operator()...;
};
template <class... Ts>
visitor(Ts...) -> visitor<Ts...>;

AB& f(AB& ab) {
    auto v = visitor{[&](const A& a) -> auto& {std::cout << "A" << std::endl;
    return ab;
}
, [&](const B& b) -> auto& {
    std::cout << "B" << std::endl;
    return ab;
}
,
};
std::visit(v, ab);
}
Run Code Online (Sandbox Code Playgroud)

它应该是这样的(如果我删除它,我会得到它-> auto&):

AB& f(AB& ab) {
    auto v = visitor{
        [&](const A& a) {
            std::cout << "A" << std::endl;
            return ab;
        },
        [&](const B& b) {
            std::cout << "B" << std::endl;
            return ab;
        },
    };
    std::visit(v, ab);
}
Run Code Online (Sandbox Code Playgroud)

这是我的.clang-format文件:

BasedOnStyle:  Google
ColumnLimit: 120
IndentWidth: 4
AccessModifierOffset: -4
AlignAfterOpenBracket: DontAlign
Run Code Online (Sandbox Code Playgroud)

我正在使用 Clang 9。

有谁知道我可以解决这个问题吗?