如果无法在MSVC上编译,为什么使用C ++ 17`constexpr这个模板化结构?

时间:2019-03-30 06:41:02

标签: c++ visual-c++ compiler-errors language-lawyer

此代码无法在MSVC上编译,错误代码为C2065“'test':未声明的标识符”。 Clang编译时没有警告,GCC编译但使用-Wall“警告:设置了变量'test'但未使用[-Wunused-but-set-variable]”警告。 在Godbolt上可以进行比较。

template <typename T>
struct foo
{
    constexpr auto operator()() const
    {
        if constexpr (constexpr auto test = true; test)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
};

int main()
{
    foo<int> bar{};

    bar();

    return 0;
}

有很多方法可以进行编译

  1. 删除foo周围的模板
  2. 删除constexpr
  3. test之外分配if constexpr
    constexpr auto test = true;
    if constexpr (test)
    

此编译失败的原因是什么?

1 个答案:

答案 0 :(得分:3)

这只是MSVC和GCC的错误。

MSVC已经有bug report

对于GCC,它可能与this bugis fixed in GCC trunk有关。