[英]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.