Consteval 函數和模板參數對函數參數的依賴
在C 17 中,使用直接在模板參數聲明中傳回常數的函數由於運行時執行限製而被禁止。隨著 C 20 中保守函數的引入,這些限制有望被消除。但是,這會使下面的程式碼能夠成功編譯嗎?
<code class="cpp">consteval int foo(int i) { return std::integral_constant<int, i>::value; }</code>
不會。
儘管 consteval 函數有編譯時評估要求,但函數定義本身只經歷一次打字。因此,由於可能存在類型差異,函數參數永遠不會被視為核心常數表達式。
C 20 提案中進一步強調了這一限制,該提案在其示例中明確排除參數被視為常數表達式:
<code class="cpp">consteval int sqrsqr(int n) { return sqr(sqr(n)); // Not a constant-expression at this point, } // but that's okay.</code>
因此,consteval 函數不允許模板參數依賴函數參數,因為參數缺乏作為常數表達式的必要類型保證。
以上是Consteval 函數能否在 C 20 中啟用模板參數對函數參數的依賴?的詳細內容。更多資訊請關注PHP中文網其他相關文章!