std :: function const正确性

问题描述 投票:7回答:1

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

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::functionoperator()分别为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不正确?

c++ std-function const-correctness
1个回答
1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.