Załóżmy, że mam typ na żądanie:
struct mutable_callable
{
int my_mutable = 0;
int operator()() { // Not const
return my_mutable++;
}
};
Zauważ, że mutable_callable
ma non-const, operator()
która modyfikuje zmienną składową .....
Załóżmy teraz, że utworzyłem std::function
z mojego typu:
std::function<int()> foo = mutable_callable{};
Teraz mogę to zrobić:
void invoke(std::function<int()> const& z)
{
z();
}
int main()
{
invoke(foo); // foo changed.....oops
}
Teraz, o ile mogę powiedzieć, std::function
s operator()
jest const
według:
https://en.cppreference.com/w/cpp/utility/functional/function/operator ()
Więc mam przeczucie, że nie powinieneś być w stanie tego zrobić .....
Ale potem patrząc na: https://en.cppreference.com/w/cpp/utility/functional/function/function
To nie wydaje się ograniczać, czy typ wywoływalny ma stałą operator()
......
Moje pytanie brzmi więc: mam rację, zakładając, że std::function<int()> const&
jest to w zasadzie to samo, std::function<int()>&
że nie ma żadnej różnicy między zachowaniem tych dwóch ...... a jeśli tak, to dlaczego nie jest const
poprawne?
std::function
implementacji MSVC : i.stack.imgur.com/eNenN.png gdzie using _Ptrt = _Func_base<_Ret, _Types...>
. Opieram swoją sprawę.
std::function
ma odpowiednikstruct a{ std::any x; };
w nim .....