代码之家  ›  专栏  ›  技术社区  ›  SirBob

为什么可以修改函数内部声明的静态常量变量?

  •  0
  • SirBob  · 技术社区  · 6 年前

    我正在为我的游戏引擎实现一个ECS框架,并研究在运行时识别组件类型的方法。这意味着我可以在内存中动态地对类似类型的组件进行连续分组。例如,我可以为 Position Velocity 我的系统可以循环使用的组件。

    我现在使用 typeid() ,但我偶然发现一篇文章 static const 为每种类型生成唯一ID的变量。一般的想法可以在下面的代码片段中总结:

    #include <iostream>
    
    struct Position { float x, y; };
    struct Velocity { float dx, dy; };
    
    template <typename T>
    int test(int x) {
        static const int y = x;
        return y;
    }
    
    int main(int argc, char **argv) {
        std::cout << test<Position>(1) << " ";
        std::cout << test<Position>(2) << " ";
        std::cout << test<Velocity>(3) << " ";
        return 0;
    }
    

    这个输出 1 1 3

    2 回复  |  直到 6 年前
        1
  •  2
  •   Robert Andrzejuk    6 年前

    静态变量只初始化一次。

    跳过初始化的第二次(以及随后的)时间。

    test . 每个唯一模板参数类型1个。

        2
  •  0
  •   TruthSeeker    6 年前

    在这里, static const int y = x; y const 意思是它是 non-mutable static

    如果您试图修改 直接在后续语句中,如果试图间接修改,则为未定义的行为。

    从c++引用中,

    -类型为const限定的对象,或const对象的不可变子对象。无法修改此类对象:直接修改是编译时错误,而间接修改(例如通过引用或指向非常量类型的指针修改常量对象)会导致未定义的行为。