目前,您不能使用static_assert
来验证函数的参数constexpr
,即使对它的所有调用确实都是constexpr
. 这是有道理的,因为编译器仍然必须创建此函数的非常量实例化,以防其他模块尝试调用它。可悲的是,即使该函数位于static
或位于匿名命名空间中也是如此。
然而,C++20 将引入一个新的关键字consteval
,类似于constexpr
但它不允许以非 constexpr 方式调用函数。在这种情况下,编译器可以确定函数参数在编译时总是已知的。因此,理论上应该可以用static_assert
.
问题是:标准允许吗?
例子:
#include <iostream>
consteval char operator""_bchar(const char text[], const size_t length)
{
static_assert(length == 8, "Binary char has to have 8 digits!"); // <-- This is currently not possible.
uint8_t byte = 0;
for (size_t i = 0; i != length; ++i)
{
byte <<= 1;
byte |= text[i] == '1' ? 0b00000001 : 0b00000000;
}
return byte;
}
int main()
{
std::cout << "01000001"_bchar << std::endl;
return 0;
}
我问是因为我要编写一些用户定义的文字(比示例更复杂)。我可以选择使用编译器扩展来处理验证,或者等待编译器更新并编写完全符合标准的代码。