std :: function const正确性

时间:2019-12-04 15:21:54

标签: c++ std-function const-correctness

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

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

请注意,mutable_callable具有用于修改成员变量的非常量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::function的{​​{1}}是operator()https://en.cppreference.com/w/cpp/utility/functional/function/operator()

所以我的直觉是您不应该这样做。....

但随后查看: https://en.cppreference.com/w/cpp/utility/functional/function/function

这似乎对可调用类型是否具有常量const ......

没有任何限制。

所以我的问题是:假设operator()std::function<int()> const&本质上是同一件事,这是正确的,两者之间的行为实际上没有区别……如果是这种情况,为什么std::function<int()>&不正确?

1 个答案:

答案 0 :(得分:3)

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

不,std::function<int()> const& f并非毫无意义。在std::function<int()>& f中,您可以为f分配一个不同的仿函数,而在const情况下则不能这样做。