2

如果我正确理解了规则immediate functions,则以下是合法用法:

consteval void func(int& a) { /* Anything here... */ }

可以调用这个函数吗?我找不到任何方法来consteval强制它必须在编译时表达式中调用,但int& a由于缺少const. 还有其他我想念的方式吗?

4

2 回答 2

3

但是int&由于缺少 a 迫使它成为运行时表达式const

不,这是一个严重的过度简化,而不是持续评估的工作原理。我们可以将移动部件(非 const 限定对象)作为评估的一部分。只要它们遵守在评估常量表达式时检查的一组严格的规则。例如:

consteval void func(int& a) { a = 2; }
consteval int func2() { int b = 0; func(b); return b; }

int arr[func2()];

2这是返回数组大小的一种非常复杂的方式,但它展示了概念和上述规则之一。在进行持续评估时,我们引入了一个辅助变量b。然后我们继续对它做一些事情,修改它,并返回结果。这就是“评估”部分。

“常数”位是在翻译过程中真正可评估的表达式,它的所有“输入”都是编译时间常数(真空)。而且我们使用的任何非常量对象都是在进行评估时才产生的,不会比它完成的寿命更长。

于 2021-07-04T12:33:31.100 回答
0
  1. 如果int &a未使用,那么传递给它的内容并不重要。这同样适用于constexpr函数。

  2. 如果您读/写到int &a,那么您的函数只能从其他一些consteval函数中使用。例子:

    consteval void func(int &x)
    {
        x++;
    }
    
    consteval int foo(int x)
    {
        func(x);
        return x;
    }
    
  3. 如果您只获取 的地址int &a,那么当给定对全局或static对象的引用时,您的函数将起作用。

于 2021-07-04T12:35:00.597 回答