假设我有这样的可调用类型:
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
的operator()
分别为const
:https://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
情况下则不能这样做。