假設我想定義一個整數百分比,如下所示:
constexpr int operator""_percent (char const * literal)
{
int percent(0);
for(; *literal != '\0'; literal)
{
if(*literal >= '0' && *literal <= '9')
{
percent *= 10;
percent = *literal - '0';
if(percent > 100)
{
...what do we do here?...
}
}
else
{
...what do we do here?...
}
}
return percent;
}
我正在考慮投擲,但我記得 aconstexpr和throw不匹配(或者僅在 C 14 和更早版本中?)。這種情況下的約定是什么?在用戶定義的文字運算子中報告錯誤的正確方法是什么?
注意:我目前使用 C 17,但計劃很快切換到 C 20。
uj5u.com熱心網友回復:
我真的不知道這種情況下的常見做法是什么,但我會在下面給出一些想法。
使用 C 20,您可以使用文字運算子consteval而不是constexpr.
出錯時,您可以拋出例外。throw運算式本身在constexpr/函式中是允許的consteval,但實際上拋出使它不是一個常量子運算式。由于consteval函式呼叫必須是常量運算式,因此程式會因錯誤而格式錯誤,編譯器必須對其進行診斷。
對于 C 17,您仍然可以拋出例外,但consteval不可用。
對于有效的文字,這不是問題。只要throw不計算運算式,對文字運算子的呼叫仍然可以是常量子運算式。
但是,如果文字無效,如果它沒有在需要常量運算式的背景關系中使用,您通常不會獲得編譯時診斷。
相反,當評估文字時,您將在程式執行期間拋出例外。這可能是不可取的,例如,如果應該在noexcept函式中使用文字。
或者,您也可以使用assert而不是拋出例外。從 C 17 開始,如果引數的計算結果為 ,則保證它是一個常量子運算式true。
如果斷言失敗,您也不會收到編譯時錯誤,而是在評估文字時程式將中止。
使用NDEBUG宏可以在發布版本中洗掉斷言。這不會影響例外規范,但您仍需要決定如何處理發布版本中未在除錯版本測驗中發現的錯誤。這可能對您的使用不夠安全。
我認為一般來說沒有任何 C 17 強制編譯時錯誤的方法。
正如我在對該問題的評論中提到的,我懷疑我的建議是否正確/良好。所以也請閱讀它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/419334.html
標籤:
上一篇:如何顯示地圖的地圖(C )?
