c++ - 成员函数内部的静态初始值设定项需要编译时常量?

标签 c++ c

我有seen它写道:

The static initializer is executed before the first invocation of the containing function; the initializer expression must be a compile-time constant.

考虑一下:

void func(){
   static float tr=((float) rand() / (RAND_MAX));
}

tr 依赖于运行时函数 rand()。我不认为 rand() 的值在编译时是已知的,是吗?然而,这在 C++ 中编译得很好,很多答案/文献表明 C 行为在这方面与 C++ 相同。

最佳答案

在 C++ 中,局部静态初始化是在第一次进入作用域时执行的,表达式根本不需要是常量。您可以调用任何您喜欢的函数。例如,单例的常见模式是:

MySingleton& get_instance() {
    static MySingleton s;
    return s;
}

只有当(并且如果)调用 get_instance 函数时才会构造实例。使用 C++11,您甚至可以保证如果 get_instance 可能同时从多个线程调用,因为编译器将添加所需的锁定逻辑,这不会有问题。

在 C 中情况有所不同,静态初始化由加载程序在程序启动之前执行,您只能使用常量表达式,因此您问题中的代码无效(您不能调用 rand)。

关于c++ - 成员函数内部的静态初始值设定项需要编译时常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35251395/

相关文章:

c++ - 从 QByteArray 加载 QQuickView

c++ - C++ 中的列表迭代器不可递增错误消息

C++ 无法正确使用 I/O

c - Readdir/closedir - Valgrind 显示 "invalid read"

c++ - 难以阅读两行代码

c++ - 运算符不应该是常量,但可以是

c++ - 如何通过 windows.draw() 的容器制作动画?

c++ - 错误 :Unresolved external Symbol of d2d1effects. h DIRECTX 中的 CLSID_D2D1HueRotation 属性

c - 定义具有多个步骤的函数宏

c - 如何使用 SSE-intrinsics 优化 C 代码以实现打包的 32x32 => 64 位乘法,并将这些结果的一半解包为(Galois Fields)