c++ - constexpr 函数中的 For 循环无法使用 MSVC 19.23 编译
问题描述
以下代码在 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'
有没有办法让这三个编译器都工作?最终,我需要对数组进行冒泡排序,以在编译时断言所有值都是唯一的。
解决方案
你过度使用了constexpr
声明。一方面,如果fieldIds
声明了,constexpr
那么它也是常量,你不能改变它。至于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;
}
};
函数作为一个整体仍然可以在常量表达式中求值,但是现在对这些变量没有额外的要求会干扰它们的声明或使用。
推荐阅读
- python - Pandas CustomBusinessDay 抵消只在一些假期工作
- c - 如何优化图像像素化程序
- excel - 如何通过自定义 Excel 功能区打开用户窗体
- asp.net-web-api - 带有接受标头和 url 参数的 Web API 内容协商格式化程序
- spring - 使用@Value Spring Annotation 从.yaml 读取的属性映射的正确用法是什么
- java - 如何在没有堆栈/正则表达式的情况下检查平衡括号?
- bash - 将文件作为一个字符串参数传递给 bash 函数
- sql - 如何将 sql 查询转换为 linq LEFT OUTER JOIN
- ios - 使用自动布局以编程方式呈现弹出视图控制器
- javascript - 构建菜单导航但在通过 json 循环时失败