為什麼 constexpr 沒有被作為型別的一部分?

時間 2021-05-08 01:24:56

1樓:暮無井見鈴

不知道題主是不是受到了 is_constexpr_evaluated 和 consteval 的刺激…

我仔細想後感覺或許還是能多出功能的。

這樣做的話 constexpr 會成為像 const/volatile/restrict 但有區別的型別限定符。

而用 constexpr 修飾返回型別的話,就會使得函式必須在編譯期求值(因為要返回常量表示式),同時引數也必須加 constexpr 。

這樣下來執行時執行的函式要另寫乙個過載。嗯,雖然複雜粗暴了一些,但是乾掉了 is_constexpr_evaluated 和 consteval 要解決的問題。

補充:但是既然要求過載,可能編譯器就無法判斷編譯期版本和執行期版本等價。想「只寫一次函式體」的話可能被迫用到模板。

接下來是可變性的問題。我想令 constexpr 物件在立即函式(現實標準草案中的 consteval 函式和此處假想的 constexpr 函式)語境中允許可變,此外的語境中不可變(有 const 限定且不允許 mutable 子物件)。

另外就是如果能令這個假設版 constexpr 只限定「值」的話,或許還能兼顧現實的 constexpr 建構函式的功能:

允許有 constexpr unique_ptr 型別值,但不會有這種型別的物件。只是允許 unique_ptr 物件從 constexpr unique_ptr 值初始化。

這樣的話我們也許有了一種手段要求非 constexpr 的靜態/執行緒物件靜態初始化:

auto MyGlobalVar = constexpr MyType; // 要求 C++17 的初始化語義

去掉 constexpr 就是現實中的寫法,只是不能在非常量初始化時自動編譯錯誤。

雖然願景是這樣……

不過要加進型別系統的話,至少還得確定這種不同於 cv 的型別限定符要如何處理、和引用/指標如何互動、過載決議如何變動。得到的東西恐怕不會比現實的 C++ 方案簡單多少吧。

2樓:消失的無意識

既然constexpr必須能變成const,為啥還需要為constexpr寫特化?而且其實constexpr對於編譯器來說並非必須的,是不是constexpr編譯器是能檢查的。之所以需要constexpr,是讓編譯器的實現方便一些,可能實現是生成乙個指令碼去跑constexpr函式。

順便吐槽一下,很多成員函式的引數const T &和T &&實現是一樣的卻要寫兩份, 返回T & ()和const T &() const要寫兩份。讓編譯器分析常量傳遞/異常傳遞/pure function傳遞有這麼困難嗎?

constexpr究竟有什麼用?

MarioCanFly CSDN 專業IT技術社群 登入 我想要給乙個string做switch操作,但是c 不能對string進行switch,只能是int或enum或者class。所以得把string轉換成int,算它的Hash值就ok了。我想要的效果是 switch hash a case h...

為什麼沒有被電死?

y梁山小道長 手速快?感覺電吹風的柄部連線線路發燙,覺得不對勁,突然小拇指感覺到燙,馬上把電吹風甩開。就算電壓220,如果當時反應慢了,頭可能也會燙傷。可怕的是,我把電吹風甩開時,那玩意特麼的火花好大,還有不知道是不是電流的發光射線射出 有點像閃電的形狀,文科生詞窮難以表述 闊怕,剛剛發生,本來想看...

孔子為什麼沒有被重用

不寧 先看段話,論語 憲問 子路宿於石門。晨門曰 奚自?子路曰 自孔氏。曰 是知其不可而為之者與?首先,我們不直接認定守門人是個普普通通的人,因為鄉野里巷不乏高人。但是,無論門人是否有大智慧型,都不改變乙個事實 孔子及其學說的不得見用,在當時是乙個顯見的印象和認識。其次,想象子路與晨門的對話情景,注...