gpt4 book ai didi

c++ - Lambda:为什么按值捕获的值是常量,但按引用捕获的值不是?

转载 作者:可可西里 更新时间:2023-11-01 18:28:27 25 4
gpt4 key购买 nike

为什么按值捕获的值是常量,但按引用捕获的对象不是:

int a;

auto compile_error = [=]()
{
a = 1;
}
auto compiles_ok = [&]()
{
a = 1;
}

对我来说这似乎不合逻辑,但它似乎是标准?特别是因为对捕获值的不必要修改可能是一个恼人的错误,但后果仅限于 lambda 范围的可能性很高,而通过引用捕获的对象的不必要修改通常会导致更严重的影响。

那么为什么不默认通过 const 引用捕获呢?或者至少支持 [const &] 和 [&]?这样设计的原因是什么?

作为解决方法,您可能应该使用 std::cref 包装的按值捕获的 const 引用?

最佳答案

假设您正在按值捕获指针。指针本身是 const,但访问它指向的对象不是。

int i = 0;
int* p = &i;
auto l = [=]{ ++*p; };
l();
std::cout << i << std::endl; // outputs 1

这个 lambda 等同于:

struct lambda {
int* p;
lambda(int* p_) : p(p_) {}
void operator()() const { ++*p; }
};

operator()() 上的 const 使用 p 等同于将其声明为:

int* const p;

引用也会发生类似的事情。引用本身是“const”(在引号中,因为不能重新设置引用),但访问它引用的对象不是。

关于c++ - Lambda:为什么按值捕获的值是常量,但按引用捕获的值不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16764153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com