const std :: function包装了一个非const运算符()/ mutable lambda

时间:2017-11-04 19:50:06

标签: c++ c++11 std-function

考虑以下示例:

#include <iostream>
#include <functional>

struct A
{
    int i;
    void operator()() 
    {
        std::cout << ++i;
    }
};

void test(std::function<void()> const& fun)
{
    fun();
}

int main() {
    const std::function<void()> f{A{}};
    test(f);
    test(f);
}

此处,const std::function可以拨打非const operator()

输出:

12

如果我提供mutable lambda,也会发生同样的情况,例如test([x = 0]() mutable { ++x; });

怎么可能?

const std::function可以包装一个可变的函子是否正常?

1 个答案:

答案 0 :(得分:6)

  

const std::function可以包装一个可变的函子是否正常?

不幸的是,是的。 std::function::operator()无条件限定为const,并不关心包裹的Callable是否发生变异。有些论文试图解决这个问题,但AFAIK没有具体的决定: