看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) Linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 最近再努力看懂rvalue相關的東西,看到一篇文章 有個人寫了is_lvalue他本來沒加"constexpr"可是有人建議他補上 他後來也補上了~想請問這個會有什麼差別嘛?? 我看這好像看反編譯的結果好像也不能再編譯期就知道結果? 想問真的有加上的必要嘛?? https://reurl.cc/mLl5Wl #include <iostream> template <typename T> constexpr bool is_lvalue(T&) { return true; } template <typename T> constexpr bool is_lvalue(T&&) { return false; } int main() { std::string a = std::string("Hello"); std::cout << "Is lValue ? " << '\n'; std::cout << "std::string() : " << is_lvalue(std::string()) << '\n'; std::cout << "a : " << is_lvalue(a) << '\n'; std::cout << "a+b : " << is_lvalue(a+ std::string(" world!!! ")) << '\n'; } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.13.128.208 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1623926961.A.965.html
oToToT: 有開 O1 以上的話看起來就有被 evaluate 掉,不過 O1 的時 06/17 19:18
oToToT: 好像不加 constexpr 在這個 case 他也會省略掉 06/17 19:18
KanzakiHAria: conextpr是編譯時期決定 值不是在動態時期才給的 06/17 19:19
KanzakiHAria: 你反編譯確定哪一段是哪一行嗎 06/17 19:23
WangDaMing: 不開最佳化應該要有差別可是我看不出來要不要加的差別 06/17 19:42
KanzakiHAria: 這個是C++規格阿 跟編譯器優化等級無關 06/17 22:58
LPH66: 標 constexpr 的函數若參數也都是 constexpr 的話 06/17 23:07
LPH66: 這樣子的呼叫可以用在文法其他地方需要 constexpr 值的位置 06/17 23:08
LPH66: 例如這裡回傳的 bool 能放在模版參數裡需要一個 bool 之處 06/17 23:09
LPH66: 至於這個 bool 值如果是執行期呼叫, 那是否 inline 或化簡 06/17 23:10
LPH66: 仍然是交給編譯器決定, 並沒有強迫一定要展開 06/17 23:10
steve1012: 你給的範例code裡面string 不是literal type 06/18 05:32