다음과 같이 호출 가능한 유형이 있다고 가정하십시오.
struct mutable_callable
{
int my_mutable = 0;
int operator()() { // Not const
return my_mutable++;
}
};
참고 mutable_callable
비 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
들 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
경우 다른 functor를에 할당 할 수 있으며이 경우에는 f
수행 할 수 없습니다 const
.