C++ 成员函数内的静态初始值设定项是否需要编译时常量?

C++ 成员函数内的静态初始值设定项是否需要编译时常量?,c++,c,C++,C,我写的是: 静态初始值设定项在第一次调用包含函数之前执行;初始值设定项表达式必须是编译时常量 考虑这一点: void func(){ static float tr=((float) rand() / (RAND_MAX)); } tr取决于运行时函数,rand()。我认为编译时不知道rand()的值,是吗?然而,C++编译的很好,很多答案/文献表明,C行为在C++方面是相同的。在C++中,在输入第一个域时执行局部静态初始化,表达式根本不需要是常数。你可以调用任何你喜欢的函数。单身人士的

我写的是:

静态初始值设定项在第一次调用包含函数之前执行;初始值设定项表达式必须是编译时常量

考虑这一点:

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\u instance
函数时,才会构造实例。使用C++11,您甚至可以保证,如果在编译器添加所需锁定逻辑的同时从多个线程调用
get\u instance
,那么就不会出现问题


在程序启动前,加载程序执行静态初始化,只能使用常量表达式,因此问题中的代码无效(不能调用<代码> RAND )。< /P> < P> >有效C++,无效C./P>
问题的答案是从C的行为,但问题显然是具体的C++ + < /P> C或C++?他们是不同的语言。@SouravGhosh关于这个问题,我读过的所有内容(包括链接的答案)一个函数中的静态变量的C和C++行为是相同的。只是一个随机猜测:这是因为严格的/迂腐的/这样的标志不在编译器中被触发吗?@ SuravgHoSH:询问一个以上的语言是合法的。特别是当它们有一个共同的子集和共同的工具时,那么它们之间的差异就变得很重要,需要理解,并且一起讨论它们是很有用的。然而,要编译这个代码,她显然使用C++,因为它不是有效的C。所以,要么取出“但是这个编译好”。然后用正确的表示C和C++之间的差异的东西替换它,或者取出标签。现在,这个问题正在传播虚假信息。很高兴知道。那么,预期的行为是什么呢?静态变量取决于运行时,但保证不是在编译时初始化,而是在首次调用函数之前初始化?