簡體   English   中英

使用 consteval 代替 constexpr 函數有什么優點?

[英]What are the advantages of using consteval instead of constexpr function?

我知道需求的差異,我最感興趣的是它帶來的代碼質量帶來的好處。

我能想到的幾件事:

  • 讀者可以只讀取函數簽名並知道該函數在編譯時被評估
  • 編譯器可能會發出更少的代碼,因為在運行時從不使用consteval (這是推測性的,我沒有這方面的真實數據)
  • 不需要有變量來強制ctfe ,最后的例子

注意:如果代碼質量太模糊,我理解有些人可能想要結束這個問題,對我來說代碼質量並不是那么模糊的術語,但是......

constexpr故障延遲到運行時的示例

constexpr int div_cx(int a, int b)
{ 
  assert(b!=0);
  return a/b;
}
    
int main()
{
    static constexpr int result = div_cx(5,0); // compile time error, div by 0
    std::cout << result; 
    std::cout << div_cx(5,0) ; // runtime error :( 
}

為了獲得有意義的、有意義的靜態反射(編譯時反射),您需要一種在編譯時執行代碼的方法。 最初的靜態反射 TS 提案使用了傳統的模板元編程技術,因為它們是在編譯時執行代碼的唯一有效工具。

但是,隨着constexpr代碼獲得更多功能,通過constexpr函數進行編譯時靜態反射變得越來越可行。 這種想法的一個問題是不允許靜態反射值泄漏到非編譯時代碼中。

我們需要能夠編寫只能在編譯時執行的代碼。 對於函數中間的一小段代碼,很容易做到這一點; 該代碼的運行時版本根本不包含反射部分,只包含它們的結果。

但是,如果您想編寫一個接受反射值並返回反射值的函數呢? 還是反射值列表?

該函數不能是constexpr ,因為constexpr函數必須能夠在運行時執行。 您可以執行諸如獲取指向constexpr函數的指針之類的操作,並以編譯器無法跟蹤的方式調用它們,從而強制它在運行時執行。

采用反射值的函數不能這樣做。 它必須僅在編譯時執行。 所以constexpr不適合這樣的功能。

輸入consteval :一個“需要”僅在編譯時執行的函數。 有一些特定的規則使指向此類函數的指針不可能泄漏到運行時代碼等中。

因此,目前consteval沒有太多用途。 它在一些地方使用, 比如source_location::current()從根本上說在運行時執行是沒有意義的。 但最終,該功能是進一步編譯時編程工具尚不存在的必要構建塊。

這是在最初提出此功能論文中規定的

然而,本文的推動力是 SG7 在編譯時反射領域所做的工作。 現在普遍同意,未來對反射的語言支持應該使用constexpr函數,但由於“反射函數”通常必須在編譯時進行評估,因此它們實際上很可能是直接函數。

暫無
暫無

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

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