在 C 11 中,按值捕获的 lambda 在功能上是不可变的,这意味着它们无法修改默认捕获的值。为了修改这种行为,使用“mutable”关键字来允许在 lambda 范围内进行修改。
考虑以下示例:
int main() { int n; [&]() { n = 10; }(); // OK, captures by reference [=]() mutable { n = 20; }(); // OK, captures by value with "mutable" // [=](){n = 10;}(); // Error, cannot modify by-value capture without "mutable" std::cout << n << "\n"; // Prints "10" }
问题出现了:为什么是“mutable”按值捕获所需的关键字?
传统上,传递给命名函数的参数是隐式可变的,允许在 功能。然而,lambda 提供了按引用捕获和按值捕获机制,这引入了不同的行为。
默认情况下,按值捕获会创建外部变量的副本,并且 lambda 只能对该临时值进行操作。如果没有“mutable”,任何修改捕获值的尝试都会导致编译器错误,因为它违反了函数对象的不变性原则。
因此,引入“mutable”关键字来显式允许修改按值捕获的 lambda。它向编译器发出信号,表明捕获的副本可以被视为可变的,从而返回到更传统的类似函数的行为。
总之,C 中的按值捕获需要“mutable”关键字11 个 lambda,因为它确保函数对象的输出与其输入保持一致,同时允许在 lambda 范围内修改捕获的副本。
以上是为什么 C 11 Lambda 中的按值捕获需要'mutable”关键字?的详细内容。更多信息请关注PHP中文网其他相关文章!