【发布时间】:2021-12-29 06:19:28
【问题描述】:
我有这样的代码:
template<typename ... Args>
constexpr size_t get_init_size(Args ... args) {
return sizeof...(Args);
}
template<typename ... Args>
constexpr auto make_generic_header(Args ... args) {
constexpr size_t header_lenght = get_init_size(args...);
return header_lenght;
}
constexpr auto create_ipv4_header() {
constexpr auto x = make_generic_header(0b01, 0b10, 0b01);
return x;
}
我知道这是虚拟代码,但我将其隔离以查找错误。
编译器给我错误(GCC):
In instantiation of 'constexpr auto make_generic_header(Args&& ...) [with Args = {int, int, int}]':
/tmp/tmp.CaO5YHcqd8/network.h:39:43: required from here
/tmp/tmp.CaO5YHcqd8/network.h:31:22: error: 'args#0' is not a constant expression
31 | constexpr size_t header_lenght = get_init_size(args...);
| ^~~~~~~~~~~~~
我尝试将限定符 const 添加到函数参数,但它同样不起作用。理论上,所有这些函数都可以在编译时计算。但是我的知识找不到问题在哪里。
【问题讨论】:
-
我想你可以在stackoverflow.com/questions/31714790/…找到答案
-
@user8510613 如果你说这是参考问题,我对简单变量有同样的错误,我现在用文本修复它,与 const cv + 简单变量相同
-
@emik_g 删除引用并不能解决问题,因为它仍然是“引用变量的 id 表达式”。您可以直接通过
return get_init_size(args...)解决此问题并完全删除header_length。 -
问题是
args在上下文 constexpr 函数make_generic_header中仍将被视为运行时初始化程序。它可以使用运行时值调用,因此涉及它们的扩展不能是make_generic_headers 正文的上下文中的 constexpr -
@Tharsalys 正如我在隔离此代码之前所说的那样,在实际代码中,我将使用此变量作为模板中参数的一部分,例如
something<header_length>
标签: c++ templates c++17 constexpr constexpr-function