std::function 常量正确性
std::function const correctness
假设我有一个像这样的可调用类型:
struct mutable_callable
{
int my_mutable = 0;
int operator()() { // Not const
return my_mutable++;
}
};
注意mutable_callable
有一个non-const 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
不正确?
这归结为与 struct A { int* x; };
相同,在 const A a;
中,您可以修改 *(a.x)
的值(但不能它指向的地方)。 std::function
中有一个间接级别(来自类型擦除),const
不会通过该级别传播。
不,std::function<int()> const& f
并非毫无意义。在 std::function<int()>& f
中,您可以将不同的函子分配给 f
,而在 const
中则不能这样做。
假设我有一个像这样的可调用类型:
struct mutable_callable
{
int my_mutable = 0;
int operator()() { // Not const
return my_mutable++;
}
};
注意mutable_callable
有一个non-const 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
不正确?
这归结为与 struct A { int* x; };
相同,在 const A a;
中,您可以修改 *(a.x)
的值(但不能它指向的地方)。 std::function
中有一个间接级别(来自类型擦除),const
不会通过该级别传播。
不,std::function<int()> const& f
并非毫无意义。在 std::function<int()>& f
中,您可以将不同的函子分配给 f
,而在 const
中则不能这样做。