gpt4 book ai didi

c++11 - 为什么 constexpr 数据成员不是隐式静态的?

转载 作者:行者123 更新时间:2023-12-01 00:43:48 24 4
gpt4 key购买 nike

如果你这样做:

constexpr int LEN = 100;
LEN变量定义为 const无需输入 const关键词。
它还有 static存储,无需键入 static关键词。

另一方面,如果我们在 class 中做同样的事情:
struct A{
constexpr static int SIZE = 100;
};
SIZE仍定义为 const无需输入 const 关键字,

然而 SIZE不是 static数据成员。
您需要输入 static明确地。否则会出现编译错误。

问题是:
需要显式键入 static 的原因是什么? ?

最佳答案

static在两种情况下都没有相同的含义:

  • 对于 LEN , static意思是“只在这个编译单元中可用”,所以只有内部链接。这是一个 storage specifier
  • 对于 A::SIZE , static表示“它是一个类成员”,因此不绑定(bind)到特定实例
  • constexpr在类上下文中可以引用实例或类成员或函数,因此编译器无法确定您所在的位置是否为 static与否,即是否绑定(bind)到特定实例。与 const 的推理相同说明符。但是,您可以想象,拥有一个非静态的 constexpr 是没有意义的。成员(member),所以禁止。例子 :
    class A
    {
    int a;
    constexpr A(int value): a(value) {}

    // constexpr bound to a specific instance
    constexpr int getDouble() const
    { return a*2; }

    // constexpr not bound to a specific instance
    static constexpr int getDouble(int b)
    { return b*2; }
    }
    constexpr在全局上下文中是指将在编译时计算的东西(或者,对于函数,如果不可能在编译时计算,它将被内联),因此不需要外部链接,因此,与 static 类似的行为全局变量或函数(仅可比较,因为通过编译时间计算或内联,您也不需要内部链接)
    constexpr int a = 5; // Will be replace everywhere by value

    /* If b is constexpr, calcul are done at compile time and result will be used
    * else double is inlined, so no need of linkage at all
    */
    constexpr int getDouble(int b)
    { return b * 2; }

    关于c++11 - 为什么 constexpr 数据成员不是隐式静态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36056269/

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