首页 > 解决方案 > 为什么 lambda 的调用运算符隐式为 const?

问题描述

我在下面的函数中有一个小的“lambda 表达式”:

int main()
{
    int x = 10;
    auto lambda = [=] () { return x + 3; };
}

下面是为上述 lambda 表达式生成的“匿名闭包类”。

int main()
{
    int x = 10;

    class __lambda_3_19
    {
        public: inline /*constexpr */ int operator()() const
        {
            return x + 3;
        }

        private:
            int x;

        public: __lambda_3_19(int _x) : x{_x}
          {}

    };

    __lambda_3_19 lambda = __lambda_3_19{x};
}

编译器生成的闭包“operator()”是隐式的 const。为什么标准委员会const默认做出来?

标签: c++c++11lambdaconstantsfunction-call-operator

解决方案


在 open-std.org 上找到 Herb Sutter 的这篇论文,讨论了这个问题。

奇怪的一对:按值捕获注入的 const 和古怪的可变
变量 考虑这个稻草人示例,程序员按值捕获局部变量并尝试修改捕获的值(它是 lambda 对象的成员变量):

int val = 0;
auto x = [=]( item e ) // look ma, [=] means explicit copy
 { use( e, ++val ); }; // error: count is const, need ‘mutable’
auto y = [val]( item e ) // darnit, I really can’t get more explicit
 { use( e, ++val ); }; // same error: count is const, need ‘mutable’

添加此功能似乎是出于担心用户可能没有意识到他得到了副本,特别是由于 lambda 是可复制的,因此他可能会更改不同的 lambda 副本。

上面的引用和示例说明了为什么标准委员会可能默认设置它const并要求mutable对其进行更改。


推荐阅读