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



请考虑以下示例:

#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可以包装可变函子是否正常?

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

不幸的是,是的。 std::function::operator()无条件地有资格成为const,并不关心包裹的Callable是否突变。一些论文试图解决这个问题,但AFAIK尚未做出任何具体决定:

  • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4348.html

  • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0045r1.pdf

相关内容

最新更新