是否可以使用非常量引用参数调用 consteval 函数?
Is it possible to call a consteval function with a non-const reference parameter?
如果我正确理解 immediate functions
的规则,下面是合法的用法:
consteval void func(int& a) { /* Anything here... */ }
这个函数可以调用吗?我找不到任何方法来这样做,因为 consteval
强制必须在编译时表达式中调用它,但是 int& a
强制它成为运行时表达式,因为缺少 const
.还有其他我想念的方法吗?
but int&
a forces it to be a runtime expression because of the missing const
不,这是一种严重的过度简化,而不是持续评估的工作原理。我们可以将移动部件(非 const 限定对象)作为评估的一部分。只要它们遵守在评估常量表达式时检查的一组严格规则。例如:
consteval void func(int& a) { a = 2; }
consteval int func2() { int b = 0; func(b); return b; }
int arr[func2()];
这是 returning 2
数组大小的一种非常复杂的方法,但它演示了概念和上述规则之一。在不断求值的同时,我们引入了一个辅助变量b
。然后我们继续用它做一些事情,修改它,然后 return 结果。这是“评估”部分。
“常量”位在翻译过程中真正被评估的表达式中,它的所有“输入”都是编译时常量(空洞的)。并且我们使用的任何非常量对象仅在进行评估时才出现,不会比完成更长时间。
如果 int &a
未被使用,则传递给它的内容无关紧要。这同样适用于 constexpr
函数。
如果您 read/write 到 int &a
,那么您的函数只能从其他 consteval
函数使用。示例:
consteval void func(int &x)
{
x++;
}
consteval int foo(int x)
{
func(x);
return x;
}
如果您只获取 int &a
的地址,那么您的函数将在给定对全局或 static
对象的引用时起作用。
如果我正确理解 immediate functions
的规则,下面是合法的用法:
consteval void func(int& a) { /* Anything here... */ }
这个函数可以调用吗?我找不到任何方法来这样做,因为 consteval
强制必须在编译时表达式中调用它,但是 int& a
强制它成为运行时表达式,因为缺少 const
.还有其他我想念的方法吗?
but
int&
a forces it to be a runtime expression because of the missingconst
不,这是一种严重的过度简化,而不是持续评估的工作原理。我们可以将移动部件(非 const 限定对象)作为评估的一部分。只要它们遵守在评估常量表达式时检查的一组严格规则。例如:
consteval void func(int& a) { a = 2; }
consteval int func2() { int b = 0; func(b); return b; }
int arr[func2()];
这是 returning 2
数组大小的一种非常复杂的方法,但它演示了概念和上述规则之一。在不断求值的同时,我们引入了一个辅助变量b
。然后我们继续用它做一些事情,修改它,然后 return 结果。这是“评估”部分。
“常量”位在翻译过程中真正被评估的表达式中,它的所有“输入”都是编译时常量(空洞的)。并且我们使用的任何非常量对象仅在进行评估时才出现,不会比完成更长时间。
如果
int &a
未被使用,则传递给它的内容无关紧要。这同样适用于constexpr
函数。如果您 read/write 到
int &a
,那么您的函数只能从其他consteval
函数使用。示例:consteval void func(int &x) { x++; } consteval int foo(int x) { func(x); return x; }
如果您只获取
int &a
的地址,那么您的函数将在给定对全局或static
对象的引用时起作用。