【发布时间】:2020-03-29 10:46:42
【问题描述】:
假设我有一个像这样的可调用类型:
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::functions 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不正确?
【问题讨论】:
-
@MaxLanghof No.....
std::function里面有一个struct a{ std::any x; };等价物..... -
这是 MSVC
std::function实现内部的一个小 sn-p:i.stack.imgur.com/eNenN.png 其中using _Ptrt = _Func_base<_Ret, _Types...>。我休息一下。
标签: c++ std-function const-correctness