[c++] std :: function const 정확성

다음과 같이 호출 가능한 유형이 있다고 가정하십시오.

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::functionoperator()입니다 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.


답변