在循环初始化中使用带有静态的 constexpr

using constexpr with static in circular initialisation?

本文关键字:静态 constexpr 循环 初始化      更新时间:2023-10-16

我试图了解如何使用来自不同来源的constexpr。但是我有一个问题,我想将下面的程序转换为使用 constexpr 而不是 const。这个程序是我的主程序的模板。

class B;
class A{
public:
constexpr A(int){}
const static B& obj;
};
class B:A{
public:
    constexpr B(int x):A(x){}
    const static B& obj;
};
const B& A::obj=B(10);
const B& B::obj=B(20);

在最后一行中,我想使用 constexpr 来确保这个 obj 变量在编译时存在,从而减小我的代码大小并进行优化,但根据标准不能使用 constexpr。它给出了有关多个声明的错误。如果我更改类 A 中的常量,则必须进行初始化。我想在 constexpr 函数中使用 obj 变量,并且由于 obj 在编译时中不存在,因此会发生错误。我问我该如何解决问题,因为如果无法做到这一点,那么代码的优化可能会受到 15% 的影响,这真的很大。

constexpr将常量应用于定义的对象时,您可以在最后一行或最后两行(如果这是您真正想要的)的const之前使用 constexpr,就像这样。

constexpr const B& A::obj=B(10);
constexpr const B& B::obj=B(20);

这行得通。在此处查看编译的演示。