假设我有一个像这样的可调用类型:
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
s 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
正确呢?
这是MSVC
—
Max Langhof
std::function
实现内部的一小段代码:i.stack.imgur.com/eNenN.png其中using _Ptrt = _Func_base<_Ret, _Types...>
。我休息一下
std::function
等价struct a{ std::any x; };
于....