【发布时间】:2018-05-12 14:51:36
【问题描述】:
我有一个用户定义的文字运算符,它只对特定长度的字符串有意义,如下所示:
constexpr uint16_t operator "" _int(const char* s, std::size_t len)
{
return len == 2 ? s[0] | (s[1] << 8) : throw;
}
这行得通:
"AB"_int // equals 16961
但这也可以编译,我不希望它:
"ABC"_int // throws at runtime
我尝试了static_assert(len == 2),但它不允许在 constexpr 函数中使用。
如何让"ABC"_int 在编译时导致错误?
【问题讨论】:
-
如果与静态断言一起使用 constexpr?使用
len作为模板参数,std::enable_if? -
@SamVarshavchik,参数在常量表达式中不可用。
constexpr函数意味着在编译时和运行时都可以使用。还有更多空间,但这就是我们现在所拥有的一切。 -
如果您使用 clang 和 g++ 支持的模板化 UDL 扩展(可能会成为未来的标准),您可以这样做。
-
这里的无参数
throw是一个 rethrow,它应该终止程序,除非它恰好在某个地方的catch子句中。 -
声明
const size_t len会有区别吗?
标签: c++ c++11 static-assert compile-time-constant user-defined-literals