奇怪的 C2143 错误,在同一函数中有两个连续的 if constexpr

Weird C2143 error with two consecutive if constexpr in the same function

我正在用 c++17 编译以下代码:

#include <iostream>

struct A {
    void barA() const {std::cout << "barA\n";}
};

struct B {
    void barB() const {std::cout << "barB\n";}
};

template<typename T>
constexpr bool isBaseA() {
    return std::is_base_of<A, T>::value;
}

template<typename T>
constexpr bool isBaseB() {
    return std::is_base_of<B, T>::value;
}

template<typename... Args>
class K : public Args... {
public:
void foo() {
    using MyK = K<Args...>;
    
    if constexpr(isBaseA<MyK>()) {
        using X = typename MyK::A;
        X::barA();
    }
    if constexpr(isBaseB<MyK>()) {
        using X = typename MyK::B;
        X::barB();
    }
}
};

int main()
{
    K<A, B> k;
    k.foo();
    return 0;
}

Demo

当使用 MSVC 2019(版本 16.8.30804.86,它应该是最后一个可用版本)构建时,我在第

行收到一个奇怪的 C2143 错误
void foo() {

完整的 C2143 错误是:

<source>(24): error C2143: syntax error: missing ')' before ';'
<source>(24): note: while compiling class template member function 'void K<A,B>::foo(void)'
<source>(41): note: see reference to function template instantiation 'void K<A,B>::foo(void)' being compiled
<source>(40): note: see reference to class template instantiation 'K<A,B>' being compiled
<source>(24): error C2143: syntax error: missing ';' before ')'
<source>(24): error C2059: syntax error: ')'

我注意到:

该代码在 gcc 和 clang 上都运行良好。 这只是一个 MSVC 错误,还是我在代码中的某处违反了 c++17 标准?

看起来像是一个解析器错误,因为添加括号可以避免错误。在这种情况下添加括号应该完全没有效果:

template<typename... Args>
class K : public Args... {
public:
void foo() {
    using MyK = K<Args...>;
    
    // extra parentheses to overcome MSVC error
    if constexpr((isBaseA<MyK>())) {
        using X = typename MyK::A;
        X::barA();
    }
    if constexpr(isBaseB<MyK>()) {
        using X = typename MyK::B;
        X::barB();
    }
}
};

compiler explorer working example