멤버 함수와 함께 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
클래스의 멤버 함수에 대한 포인터이다T
과t1
유형의 목적T
또는 유형의 객체에 대한 참조T
또는 유래의 유형의 객체에 대한 참조T
;-
((*t1).*f)(t2, ..., tN)
때f
클래스의 멤버 함수에 대한 포인터이다T
및t1
이전에 기재된 종류의 것이 아니다;- 그리고하는 클래스의 데이터 멤버에 대한 포인터 및 유형의 목적 또는 유형의 객체에 대한 참조 또는 유래의 유형의 객체에 대한 참조 ;
t1.*f
N == 1
f
T
t1
T
T
T
- 그리고하는 클래스의 데이터 멤버에 대한 포인터 와 이전에 기재된 종류의 것이 아니다;
(*t1).*f
N == 1
f
T
t1
—
f(t1, t2, ..., tN)
다른 모든 경우.
처음 두 옵션은 참조와 포인터를 모두 허용합니다.
여기서 주목해야 할 중요한 점은 문구가 일반 포인터로 제한 되지 않는다는 것입니다. 당신은 사용할 수 std::shared_ptr
행하면서 살아 인스턴스를 유지하기 위해 또는 다른 스마트 포인터를하고이를 것이라고 여전히 직장 std::bind
으로 t1
역 참조, (그것이 가능하다는 물론, 주어진) 어떤 상관없이.
정답에 추가하려면 (두 양식 모두 허용됨)
나는 "값에 의해 전달"또는 "참조에 의해 전달"될 수있는 함수 인수 선언과 유사하게 두 가지 바인딩 옵션을 생각합니다.
의 경우 f1
(일명 통과 my_foo
결과에 대한 변경 사항 "을 참조하십시오"하지 않습니다 "값") my_foo
바인딩 포인트 과거를. 이것은 특히 my_foo
진화 하는 경우 바람직하지 않을 수 있습니다 . "값별"바인딩에는 복사 생성자에 대한 (여러) 호출의 추가 "비용"이 있습니다.
차이가 있습니다. rytis가 제시 한 것처럼 값을 전달해도 my_foo에 대한 변경 사항이 표시되지 않습니다. 예를 들어 my_foo가 클래스 인 경우 값으로 전달해도 my_foo의 멤버 데이터에 대한 변경 사항이 표시되지 않습니다.
'IT Share you' 카테고리의 다른 글
단일 아포스트로피로 표시된 Rust 유형은 무엇입니까? (0) | 2020.11.28 |
---|---|
파이썬에서 객체에 속성을 추가 할 수없는 이유는 무엇입니까? (0) | 2020.11.28 |
C ++ 14에서 쌍 배열의 초기화에 여전히 이중 중괄호가 필요한 이유는 무엇입니까? (0) | 2020.11.28 |
좋은 HAML-> ERB / HTML 변환기가 있습니까? (0) | 2020.11.28 |
toLowerCase의 NullPointer이지만 그 방법은 어디에도 사용하지 않습니다. (0) | 2020.11.28 |