C 中的 constexpr函式 是不是不夠嚴謹

時間 2021-06-05 11:20:41

1樓:stay

你可以這樣理解,如果不用constexpr函式,有template

cnt>

struct

scale_t

:integral_constant

,cnt

>{}size_t

scale

(size_t

cnt)

inti=3

;int

cval

=scale_t

<3>::

value

;int

val=

scale(i

);constexpr(指函式)通過將scale_t和scale整合在一起的方式,使得編譯器可以選擇呼叫scale_t來生成編譯期常量或者scale來生成對應的函式,這樣同乙個功能的函式就不用寫兩遍

而constexpr(指變數)實際上你可以理解為乙個編譯期常量(表示式)的別名,如此一來constexpr int val = scale(i)自然就不成立了,因為此時i的值不是編譯期確定的(比如std::cin>>i),scale此時等同於呼叫函式,scale(i)自然就不是編譯期常量了;而ci是乙個通過編譯期常量初始化的乙個const變數,const變數不允許寫入(雖然可以const_cast),因此實際上ci其實是constexpr變數,scale(ci)也會得到乙個編譯期常量,只要你把3改成i,那麼連cval也會編不過

C 在constexpr中的new是怎麼實現的?

露公尺 Lumi constexpr標記的函式,可以在執行時呼叫,也可以在編譯期完成。你可以認為,如果它能在編譯期完成,那麼編譯器就會在編譯期去完成這個函式的計算。為啥C 2020要求必須在該函式結束前就要釋放掉,我覺得應該是為了編譯器方便實現吧。如果你還能返回或者放在成員變數裡等在這個函式的上一層...

C 中是否應避免使用C語言函式

大段長安 沒有必要可以避免吧,除非發現特別不利的影響,比如影響了程式的效率。我不是專業程式設計師,所以一貫在c 中寫入一些c函式的。就從你的舉例來說,printf的可讀性確實要好一些。 SuperFashi 是的,C 使用時除非實在沒有替代品 例如exit函式 否則一定避免使用C。例如不用sprin...

c 中,delete是如何呼叫虛析構函式的?

Pluto Hades 正常情況下,基類的構造和析構是不會被派生類覆蓋的。這也很好記,因為它們不同名嘛 正常new派生類指標,會先呼叫基類構造再呼叫派生類構造。正常delete派生類指標,和構造相反,先呼叫派生類析構,再呼叫基類析構。 Bunny.Lann 虛成員函式和虛析構函式肯定都是呼叫D的,只...