首页 >后端开发 >C++ >如何在 C 中使用 Constexpr 静态函数正确初始化 Constexpr 静态成员?

如何在 C 中使用 Constexpr 静态函数正确初始化 Constexpr 静态成员?

Linda Hamilton
Linda Hamilton原创
2024-12-02 13:35:12755浏览

How Can I Correctly Initialize a Constexpr Static Member Using a Constexpr Static Function in C  ?

constexpr 使用静态函数初始化静态成员:演练

简介

您提出的场景涉及使用静态函数初始化类中的 constexpr 静态成员constexpr 函数。不幸的是,尝试通过特定方法实现这一点在不同版本的 gcc 中遇到了挑战。在本文中,我们剖析这些尝试,探讨错误的根本原因,并提供可能的解决方案或说明。

第一次尝试及其错误

您的初始尝试涉及声明 constexpr 函数foo 和 constexpr 静态成员 bar 在类体内,但这会导致编译错误。它们表明函数调用不能存在于常量表达式中,并且静态类成员不能具有非常量的初始值设定项。

第二次尝试及其错误

第二次尝试将声明移到类主体之外,但这仍然导致错误。值得注意的是,错误消息提到静态数据成员 bar 必须有一个初始值设定项,并且其声明为 constexpr 与其先前在类外的声明相矛盾。

分析标准

C 标准的第 9.4 节.2 规定文字类型的静态数据成员可以在其声明中包含 constexpr 说明符。但是,它们的初始化程序必须是大括号或等于初始化程序,并且其中的任何赋值表达式都必须是常量表达式。

在您的两次尝试中, bar 的声明都缺少大括号或等于-初始化程序。因此,它们都不符合标准规定的要求。

限制和解决方案

但是,这种情况具有标准所施加的固有限制。它不允许在类完整的上下文中初始化静态 constexpr 数据成员。因此,使用大括号或等于初始化器规则仅适用于非静态数据成员。

因此,使用依赖于类完成的 constexpr 函数来初始化静态 constexpr 数据成员变得不可能。此限制可能是由于要求 constexpr 变量必须可用作成员函数上下文中的编译时常量表达式。因此,变量初始值设定项必须在函数体之前完全定义,但静态数据成员的初始值设定项会导致在此上下文中未定义的函数调用,从而违反了常量表达式要求。

以上是如何在 C 中使用 Constexpr 静态函数正确初始化 Constexpr 静态成员?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn