【问题标题】:Is it possible to call a consteval function with a non-const reference parameter?是否可以使用非常量引用参数调用 consteval 函数?
【发布时间】:2021-09-15 13:27:24
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ c++20 consteval


    【解决方案1】:

    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。然后我们继续对它做一些事情,修改它,并返回结果。这就是“评估”部分。

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

    【讨论】:

      【解决方案2】:
      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 对象的引用时,您的函数将起作用。

      【讨论】:

        猜你喜欢
        • 2019-12-05
        • 2022-01-06
        • 2020-12-01
        • 2023-02-22
        • 1970-01-01
        • 2019-10-10
        • 1970-01-01
        • 1970-01-01
        • 2021-12-10
        相关资源
        最近更新 更多