成员函数中的静态初始值设定项需要编译时常量
Static initializer inside member function require 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++有效,它不是有效的 C。
问题中链接的答案来自哪里是指C的行为,但这个问题显然是特定于C++的。
相关文章:
- C++常量数组的编译时间较长
- 在编译时将常量字符* 转换为常量 char_type*
- 将编译时常量向量转换为堆分配版本
- 如何在常量计算表达式中获取编译时错误?
- 如何在编译时解析静态常量 std::string?
- 有没有办法在类实例中存储编译时常量?
- 检测编译时文本和常量
- ARM C++编译器不会编译具有可变常量成员的结构
- 强制在编译时计算类的类的常量成员
- Constexpr 类采用常量引用不编译
- 为什么对数组的常量左值引用不编译在下面?
- 由于缺少常量而出现编译错误
- 为什么在将常量 ptr 分配给常量引用时没有收到编译错误?
- 为什么可以在编译时访问非常量、非静态成员而无需类的实例
- 不是 VS2017 中的编译时常量表达式
- 将编译时定义大小的数组初始化为常量表达式
- 将大小为编译时常量的数组初始化为单个值
- 如何为 std::array 声明全局编译时常量?
- 返回非常量引用编译的 Const 方法
- 常量正确性编译错误到模板函数中的无效转换错误