std::function 常量正确性

std::function const correctness

假设我有一个像这样的可调用类型:

struct mutable_callable
{
    int my_mutable = 0;
    int operator()() { // Not const
        return my_mutable++;
    }
};

注意mutable_callable有一个non-const operator()修饰一个成员变量.....

现在假设我用我的类型创建了一个 std::function

std::function<int()> foo = mutable_callable{};

现在我可以做到了:

void invoke(std::function<int()> const& z)
{
    z();
}

int main()
{
    invoke(foo); // foo changed.....oops
}

现在据我所知 std::functions operator()consthttps://en.cppreference.com/w/cpp/utility/functional/function/operator()

所以我的直觉是你不应该能够做到这一点......

但接着看: https://en.cppreference.com/w/cpp/utility/functional/function/function

这似乎对可调用类型是否具有常量没有任何限制operator()......

所以我的问题是:我正确地假设 std::function<int()> const&std::function<int()>& 本质上是一样的,两者的行为实际上没有区别.... ..如果是这样,为什么 const 不正确?

这归结为与 struct A { int* x; }; 相同,在 const A a; 中,您可以修改 *(a.x) 的值(但不能它指向的地方)。 std::function 中有一个间接级别(来自类型擦除),const 不会通过该级别传播。

不,std::function<int()> const& f 并非毫无意义。在 std::function<int()>& f 中,您可以将不同的函子分配给 f,而在 const 中则不能这样做。