假设我想定义一个百分比整数,如下所示:
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;
}
我曾考虑使用throw,但我记得
constexpr
和throw
不太匹配(或者这只是在C++14及更早版本中如此?)。在这种情况下的惯例是什么?如何在用户定义字面量运算符中报告错误?注:我目前使用的是C++17,但计划很快转换到C++20。
std::strtol
不是一个 constexpr 函数,因此你的整个字面量运算符无法成为 constexpr。 - 273Kconsteval
而不是constexpr
,然后抛出异常将保证导致编译时错误。 - user17732522<chrono>
的设计者 Howard Hinnant 的个人偏好。 - Davis Herringnoexcept
如果它不是consteval
会有优势,但是我没有看到在不让其具有错误报告的情况下不将其设置为consteval
的任何优点,除非是为了允许使用运行时值直接调用运算符,这对我来说似乎不是预期的用法。但正如我所说,我可能忽略了某些东西。 - user17732522noexcept
函数中,您也可以使用throw
来失败常量评估。我认为错误处理策略只是为了与运行时设施保持一致。 - Davis Herring