IT Share you

멤버 함수와 함께 std :: bind를 사용하여이 인수에 대해 개체 포인터를 사용합니까?

shareyou 2020. 11. 28. 13:14
반응형

멤버 함수와 함께 std :: bind를 사용하여이 인수에 대해 개체 포인터를 사용합니까?


std::bind멤버 함수를 바인딩하는 데 사용할 때 첫 번째 인수는 개체 this포인터입니다. 그러나 그것은 객체를 포인터로 전달하는 것이 아니라 포인터로 전달하는 것으로 작동합니다.

예를 들어 다음 프로그램을 참조하십시오.

#include <iostream>
#include <functional>

struct foo
{
    void bar(int v) { std::cout << "foo::bar - " << v << '\n'; }
};

int main()
{
    foo my_foo;

    auto f1 = std::bind(&foo::bar, my_foo, 1);
    auto f2 = std::bind(&foo::bar, &my_foo, 2);

    f1();
    f2();
}

clang과 GCC 모두 불만없이이를 컴파일하며 결과는 두 바인딩 모두에서 작동합니다.

foo :: bar-1
foo :: bar-2

나는 사양 (섹션 20.8.9)에 대해 머리를 감싸려고 노력해 왔지만 그것이 나에게 명확하지 않은 곳 중 하나입니다.

하나만 맞아야합니까, 아니면 둘 다 맞습니까?


둘 다 맞습니다. 20.8.9.1.2는 20.8.2로 전달되어에 대한 호출의 요구 사항과 효과를 설명합니다 bind. 20.8.2는 다음과 같습니다.

20.8.2 요구 사항 [기능 요구 사항]

1 INVOKE(f, t1, t2, ..., tN) 를 다음과 같이 정의 합니다.

- (t1.*f)(t2, ..., tN)f클래스의 멤버 함수에 대한 포인터이다 Tt1유형의 목적 T또는 유형의 객체에 대한 참조 T또는 유래의 유형의 객체에 대한 참조 T;

- ((*t1).*f)(t2, ..., tN)f클래스의 멤버 함수에 대한 포인터이다 Tt1이전에 기재된 종류의 것이 아니다;

- 그리고하는 클래스의 데이터 멤버에 대한 포인터 유형의 목적 또는 유형의 객체에 대한 참조 또는 유래의 유형의 객체에 대한 참조 ;t1.*fN == 1fTt1TTT

- 그리고하는 클래스의 데이터 멤버에 대한 포인터 이전에 기재된 종류의 것이 아니다;(*t1).*fN == 1fTt1

f(t1, t2, ..., tN)다른 모든 경우.

처음 두 옵션은 참조와 포인터를 모두 허용합니다.

여기서 주목해야 할 중요한 점은 문구가 일반 포인터로 제한 되지 않는다는 것입니다. 당신은 사용할 수 std::shared_ptr행하면서 살아 인스턴스를 유지하기 위해 또는 다른 스마트 포인터를하고이를 것이라고 여전히 직장 std::bind으로 t1역 참조, (그것이 가능하다는 물론, 주어진) 어떤 상관없이.


정답에 추가하려면 (두 양식 모두 허용됨)

나는 "값에 의해 전달"또는 "참조에 의해 전달"될 수있는 함수 인수 선언과 유사하게 두 가지 바인딩 옵션을 생각합니다.

의 경우 f1(일명 통과 my_foo결과에 대한 변경 사항 "을 참조하십시오"하지 않습니다 "값") my_foo바인딩 포인트 과거를. 이것은 특히 my_foo진화 하는 경우 바람직하지 않을 수 있습니다 . "값별"바인딩에는 복사 생성자에 대한 (여러) 호출의 추가 "비용"이 있습니다.


차이가 있습니다. rytis가 제시 한 것처럼 값을 전달해도 my_foo에 대한 변경 사항이 표시되지 않습니다. 예를 들어 my_foo가 클래스 인 경우 값으로 전달해도 my_foo의 멤버 데이터에 대한 변경 사항이 표시되지 않습니다.

참고 URL : https://stackoverflow.com/questions/15264003/using-stdbind-with-member-function-use-object-pointer-or-not-for-this-argumen

반응형