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)
解决这个问题的一种方法(也是最简单的方法)是将 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)
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |