gpt4 book ai didi

c++ - constexpr 函数中的 For 循环无法使用 MSVC 19.23 进行编译

转载 作者:行者123 更新时间:2023-11-30 01:33:32 24 4
gpt4 key购买 nike

以下代码在 Clang 和 GCC 中编译,但在 MSVC 中失败。

template <typename... FieldsSequence>
struct S {
static constexpr bool checkIdUniqueness()
{
using IdType = int;
constexpr IdType fieldIds[sizeof...(FieldsSequence)]{ 0 };
for (size_t i = 0; i < std::size(fieldIds) - 1; ++i)
{
if (fieldIds[i] > fieldIds[i + 1])
{
constexpr auto tmp = fieldIds[i];
fieldIds[i] = fieldIds[i + 1];
fieldIds[i + 1] = tmp;
}
}

return true;
}
};

错误信息是:

expression did not evaluate to a constant
note: failure was caused by a read of a variable outside its lifetime
note: see usage of 'i'

有没有办法让它在所有三个编译器上工作?最终,我需要对数组进行冒泡排序,以在编译时断言所有值都是唯一的。

https://godbolt.org/z/9XbP6-

最佳答案

您过度使用了 constexpr 声明。其一,如果 fieldIds 被声明为 constexpr 那么它也是 const,你不能改变它。至于tmp,因为它被声明为constexpr,初始化器必须是一个常量表达式,但它不可能真的是一个。

正确的方法是从这些声明中删除 constexpr:

template <typename... FieldsSequence>
struct S {
static constexpr bool checkIdUniqueness()
{
using IdType = int;
IdType fieldIds[sizeof...(FieldsSequence)]{ 0 };
for (size_t i = 0; i < std::size(fieldIds) - 1; ++i)
{
if (fieldIds[i] > fieldIds[i + 1])
{
auto tmp = fieldIds[i];
fieldIds[i] = fieldIds[i + 1];
fieldIds[i + 1] = tmp;
}
}

return true;
}
};

作为一个整体的函数仍然可以在常量表达式中求值,但现在对那些可能干扰它们的声明或使用的变量没有额外的要求。

关于c++ - constexpr 函数中的 For 循环无法使用 MSVC 19.23 进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58366732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com