簡體   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