假设我有一个像这样的可调用类型:
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()>&
不正确?
答案 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
情况下则不能这样做。