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

韦斯·托勒曼

此代码无法在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)
    

编译失败的原因是什么?

xskxzr

这只是MSVC和GCC的错误。

已经有MSVC错误报告

对于GCC,它可能与此错误有关,并且已在GCC干线中修复

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果无法编译未使用的函数,则模板类可以使用 C++17 编译,但不能使用 C++20 编译

将基于 constexpr 的 C++17 模板化代码转换为 C++14

如果constexpr失败,为什么会这样使用C ++ 17?

如果结构化绑定不能是constexpr,为什么可以在constexpr函数中使用它们?

为什么C ++ 17结构化绑定不使用{}?

C ++:为什么这个constexpr不是编译时间常数

C ++ 17元编程递归结构:枚举或constexpr

无法编译包含“ if constexpr”的函数模板实例化

在Boost zip迭代器上使用C ++ 17并行执行算法时,为什么会出现MSVC错误?

为什么这个模板化函数不能对数组进行零初始化编译?

为什么这个模板函数不能编译C ++

为什么使用MSVC编译此错误的std :: function初始化?

为什么这个部分模板专业化失败了?

为什么此Rust代码使用结构上的生存期绑定进行编译,但如果绑定仅在impl上进行编译,则给出生命周期错误呢?

为什么这个C ++程序可以在MacOS上编译而不能在Ubuntu上编译?

在模板化结构范围内使用声明模板化

如果count()是constexpr函数,为什么std :: array <int,count()>无法编译?

为什么以下模板化的类成员函数无法编译?

如果变量没有初始化,为什么这个 C 代码需要这么长时间来编译和执行?

为什么我不能使用msvc在模板类中声明静态constexpr变量?

constexpr函数中的for循环无法使用MSVC 19.23进行编译

创建一个模板来像C ++ 17的结构化绑定一样在C ++ 11中迭代映射

为什么C ++可以使用派生结构实例化其父模板结构,而父模板可以调用子结构的函数?

std :: abs可以在constexpr函数中使用,但前提是必须将其模板化。为什么?

如何使用模板化constexpr成员函数初始化constexpr std :: array?

用C ++中的附加模板参数扩展模板化结构

为什么这个 C 结构体初始化代码会产生总线错误?

C++ 模板专业化更改 constexpr 规则?

为什么 Clang 更喜欢主模板而不是 C++17 的专业化?