忽略参数的 consteval lambda 无法编译

Ben*_*tto 6 c++ lambda language-lawyer c++20 consteval

我有一个 lambda 忽略其int参数并始终返回一个常量。如果我标记它consteval,编译就会失败,因为。编译器抱怨使用consteval非常量参数调用 lambda。但是参数与 lambda 有什么关系呢?

来自编译器资源管理器

来源:3:16:错误:“i”的值在常量表达式中不可用 5 | 拉姆达(i);

void bar (auto lambda, int start, int end) {
    for (int i=start; i<end; ++i) {
        lambda(i);
    }
}

int main( )
{
    auto foo = [] (int) consteval { return 2;};

    bar(foo, 1, 9);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

use*_*570 2

解决这个问题的一种方法(也是最简单的方法)是将 lambda 的参数类型更改为,int&这样它就不需要读取值,如下所示:

int main( )
{//-------------------v------------------------->reference added
    auto foo = [] (int&) consteval { return 2;};

    bar(foo, 1, 9);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

工作演示

这是另一个具有类似行为的人为示例:

template<typename T>
consteval int func(const T) //note NO REFERENCE HERE
{
    return std::is_integral<T>::value;;
}

template<typename T>
//-----------------------v----->note the reference here
consteval int bar(const T&)
{
    return std::is_integral<T>::value;;
}

int main()
{
    
    int p = 2;
    //constexpr int d = func(p); //doesn't work
    constexpr int f = bar(p); //works

}
Run Code Online (Sandbox Code Playgroud)

人为的示例演示