std :: function const 정확성


11

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

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정확 하지 않습니까?


아니 @MaxLanghof ..... std::functionA와 동등한있다 struct a{ std::any x; };..... 거기에를
DarthRubik

다음은 MSVC std::function구현 내부에 대한 작은 스 니펫입니다 . i.stack.imgur.com/eNenN.png 여기서 using _Ptrt = _Func_base<_Ret, _Types...>. 난 내 경우를 휴식.
Max Langhof 2016

답변:


3

이것은와 동일하게 귀결 struct A { int* x; };되며 여기서 const A a;수정할 수 *(a.x) 있지만 이 가리키는 곳은 아닙니다. 전파되지 않는 ( std::function지우기 유형에서) 간접적 인 수준이 있습니다 const.

그리고 아니, std::function<int()> const& f무의미하지 않습니다. 의 std::function<int()>& f경우 다른 functor를에 할당 할 수 있으며이 경우에는 f수행 할 수 없습니다 const.


그렇습니다. ..... 실제로 많은 의미가 있습니다 ... 그래도 언뜻보기에는 혼란 스럽습니다
DarthRubik

디자인 결함이라고 생각합니다. 이 간접적 인 지시는 사용자에게 투명한 구현 세부 사항이어야하며, 일부 메타 프로그래밍을 사용하여 constness가 전파 될 수 있습니다.
Igor R.

@IgorR. 예, constness가 전파 될 수 있습니다. std::vector그렇지 std::unique_ptr않습니다. 나는 std::function실제로 functor state의 변형을 표현하는 것이 아니라고 생각합니다. 어쩌면 우리는 가증 한 함수 유형 (예 :)을 다른 용도로 재사용 할 수 std::function<int() const>있습니까?
Max Langhof 2016

unique_ptr일반 포인터와 달리 constness를 전파해서는 안됩니다. 그리고 std::function<int() const>컴파일되지 않습니다.
Igor R.

@IgorR. 알아. 내 요점은 표준 라이브러리의 일부는 그것을하고 다른 일부는 그렇지 않다는 것입니다. 어느 카테고리에 속 std::function해야하는지 명확하지 않습니다. 그리고 std::function<int() const>그것은 가설적인 것입니다. 물론 지금 컴파일되지는 않지만, 그것이 유효 할 수 있다면 여기의 OP를 만족시킬 operator() const것입니까? (가증 한 기능 유형을 사용하여 상당히 끔찍한 장면 뒤에서도)?
Max Langhof 2016
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.