【发布时间】:2019-12-05 04:44:33
【问题描述】:
目前您不能使用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;
}
我问是因为我要编写一些用户定义的文字(比示例更复杂)。我可以选择使用编译器扩展来处理验证,或者等待编译器更新并编写完全符合标准的代码。
【问题讨论】:
标签: c++ static-assert c++20 consteval