簡體   English   中英

我們應該在函數中用 constexpr 定義變量嗎

[英]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將在編譯時進行評估,而funci則不會?

有一個重要的區別。

靜態局部變量在第一次調用時被初始化,因此在隨后的調用中不再使用它的聲明。 特別是,靜態局部變量的構造函數只被調用一次。 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
  1. 初始化

在上面的代碼中,只有a是編譯時常量。 它應在編譯時初始化。 這個想法是花時間在編譯上並在運行時節省時間。 但是, i可能在編譯時或運行時被初始化。

至於你應該使用哪個? 使用滿足您需求的任何一種。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM