[問題] constexpr 使用的時機

看板C_and_CPP作者 (沒有存在感的人)時間9年前 (2015/05/07 21:52), 9年前編輯推噓2(2021)
留言23則, 4人參與, 最新討論串1/4 (看更多)
剛剛學到constexpr這個關鍵字,不過看了很久不是很了解使用的時機。 依照這個網頁: http://en.cppreference.com/w/cpp/language/constant_expression 似乎是可以在等號右邊放function的const? 不知道前輩們有無進一步的見解? 感謝。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 90.41.64.229 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1431006723.A.67D.html

05/07 22:15, , 1F
有些地方需要編譯時期常數的可以使用宣告為 constexpr 的值
05/07 22:15, 1F

05/07 22:16, , 2F
例如網頁裡開頭的例子, 模版參數非型別的需為編譯時期常數
05/07 22:16, 2F

05/07 22:16, , 3F
當然能寫 constexpr 的式子就很有限
05/07 22:16, 3F

05/07 22:16, , 4F
大原則是編譯時可以算得出來的值
05/07 22:16, 4F

05/07 22:29, , 5F
用在變數上跟用在函式上意義差很多, constexpr函式除了可以
05/07 22:29, 5F

05/07 22:30, , 6F
用在編譯期計算, 也能像一般函式在執行期計算
05/07 22:30, 6F

05/07 23:24, , 7F
主觀上, 我倒是覺得意義沒有差很多.
05/07 23:24, 7F

05/07 23:27, , 8F
倒是要分清楚 const 跟 constexpr 意義不一樣
05/07 23:27, 8F

05/07 23:28, , 9F
constexpr 就是著眼於所有編譯期能先算出來的東西.
05/07 23:28, 9F

05/07 23:30, , 10F
原則上如果你能加就盡量加 xD
05/07 23:30, 10F

05/07 23:31, , 11F
少數不該加的情況是在於你不確定他真的可以是 constexpr
05/07 23:31, 11F

05/07 23:32, , 12F
你加了以後, 別人會以為他是. 之後要改的話可能會造成災難
05/07 23:32, 12F

05/07 23:36, , 13F
constexpr 的成立條件可能依賴另一個 constexpr
05/07 23:36, 13F

05/07 23:55, , 14F
所以是說constexpr = only編譯時期的常數?
05/07 23:55, 14F

05/07 23:55, , 15F
那可以連static並用嗎? 如果在某物件裡宣告為
05/07 23:55, 15F

05/07 23:56, , 16F
static constexpr的變數可以拿到main裏面用嗎?
05/07 23:56, 16F
像是 class A{ static constexpr int var(...) } int main() { cout << A::var() ; } 這樣用法OK嗎? (說實話我還是不懂) ※ 編輯: wtchen (90.41.64.229), 05/07/2015 23:59:01

05/08 00:02, , 17F
抱歉, 我看不太懂你的問題. 不過你可以寫看看阿
05/08 00:02, 17F

05/08 00:03, , 18F
你這個例子比較大的問題反而是存取限制
05/08 00:03, 18F

05/08 00:12, , 19F
因為說實話我也看不太懂constexpr跟const的差別
05/08 00:12, 19F

05/08 00:12, , 20F
想說是不是有哪些case非要用constexpr不可的
05/08 00:12, 20F

05/08 00:20, , 21F
非用 constexpr 不可的通常都是函數.
05/08 00:20, 21F

05/08 00:21, , 22F
但是你可以想想如果 x 是個 const int,
05/08 00:21, 22F

05/08 00:21, , 23F
那 std::array<int, x> foo; 這行是合法的嗎 ?
05/08 00:21, 23F
文章代碼(AID): #1LIsu3Pz (C_and_CPP)
文章代碼(AID): #1LIsu3Pz (C_and_CPP)