[英]Should we define variable with constexpr in a function
不知道在函數中用constexpr定義變量是否有意義。
void func() { static const int i = 1; }
void func2() { constexpr const int i = 1; }
static const
中的static const
將在第一次函數調用時初始化,函數中的constexpr
怎么樣? 我知道constexpr
指定對象在編譯期間應該可用。 那么這是否意味着func2
中的變量i
將在編譯時進行評估,而func
的i
則不會?
有一個重要的區別。
靜態局部變量在第一次調用時被初始化,因此在隨后的調用中不再使用它的聲明。 特別是,靜態局部變量的構造函數只被調用一次。 static const
是一個靜態變量,它也是一個常量:因此,它的值一旦在第一次調用時初始化,就不能再更改。
constexpr
表達式是可以在編譯時計算的表達式。 因此,例如, constexpr
變量可以用作非類型模板參數。
一般來說,你不能使用簡單的static const
作為模板參數,因為即使它是一個常量,它的實際值也可能無法在編譯時確定; 例如:
void f(int x)
{
static const i = x;
std::array<int, i> a; // Compile error!
}
盡管如此,初始化為常量表達式的整型變量仍然可以用作非類型模板參數。 因此,在問題的代碼中, func2
的變量i
可以用作非類型模板參數。
有一些差異。 初始化就是其中之一。 讓我們重命名變量,以便我們可以更輕松地討論它們:
void func() { static const int i = 1; } //internal linkage
void func2() { constexpr const int a = 1; } //external linkage
在上面的代碼中,只有a
是編譯時常量。 它應在編譯時初始化。 這個想法是花時間在編譯上並在運行時節省時間。 但是, i
可能在編譯時或運行時被初始化。
至於你應該使用哪個? 使用滿足您需求的任何一種。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.