繁体   English   中英

成员函数内的静态初始化程序需要编译时常量吗?

[英]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 ++特有的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM