簡體   English   中英

為什么強制constexpr僅具有編譯時錯誤?

[英]Why force constexpr have compile time error only?

我正在觀看CppCon 2015:Scott Schurr“ constexpr:Applications” ,在19'28上,他展示了一個僅強制編譯時錯誤的技巧:

一種僅強制編譯時的方法?

  • 不符合標准
  • 但是有時會起作用

拋出中未解決的符號

 extern const char* compile11_bin_invoked_at_runtime; template <typename T = std::uint32_t> constexpr T compile11_bin( constexpr_txt t, std::size_t i = 0, // index std::size_t b = 0, // bit count T x = 0) // accumulator { return i >= t.size() ? x : // end recursion b >= std::numeric_limits<T>::digits ? throw std::overflow_error("Too many bits!") : t[i] == ',' ? compile11_bin<T>(t, i+1, b, x) : t[i] == '0' ? compile11_bin<T>(t, i+1, b+1, (x*2)+0) : t[i] == '1' ? compile11_bin<T>(t, i+1, b+1, (x*2)+1) : throw std::domain_error( // Only '0', '1', and ',' compile11_bin_invoked_at_runtime); } 

我很好奇,強迫constexpr只產生編譯時錯誤的動機是什么?

編譯時錯誤總是比運行時錯誤更好。

為什么? 因為編譯時錯誤可以在不運行應用程序的情況下得到修復,因此可以很容易地修復。 通過拋出未解析的外部符號,可以強制將compile11_bin的結果存儲在constexpr變量中,這使您可以更快地檢測錯誤。

幻燈片中的示例是:

constexpr auto maskA = constexpr11_bin<std::uint8_t>("1110 0000");
auto maskB = constexpr11_bin<std::uint8_t>("0001 1111");

在這里, maskA導致編譯時錯誤,可以很容易地解決該錯誤。 maskB上運行時錯誤另一方面的結果,因為maskB不constexpr,所以結果不具有在編譯時進行評估,你會得到一個運行時錯誤。

那是因為compile11_bin_invoked_at_runtime是一個未解決的外部符號,每個符號都必須有一個定義,因此即使在編譯器本身並不抱怨的情況下 ,您在編譯時也會遇到錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM