Using std::bind with member function, use object pointer or not for this argument?
Solution 1:
Both are correct. 20.8.9.1.2 forwards to 20.8.2 to describe the requirements and the effect of your call to bind
. 20.8.2 is:
20.8.2 Requirements [func.require]
1 Define INVOKE
(f, t1, t2, ..., tN)
as follows:—
(t1.*f)(t2, ..., tN)
whenf
is a pointer to a member function of a classT
andt1
is an object of typeT
or a reference to an object of typeT
or a reference to an object of a type derived fromT
;—
((*t1).*f)(t2, ..., tN)
whenf
is a pointer to a member function of a classT
andt1
is not one of the types described in the previous item;—
t1.*f
whenN == 1
andf
is a pointer to member data of a classT
andt1
is an object of typeT
or a reference to an object of typeT
or a reference to an object of a type derived fromT
;—
(*t1).*f
whenN == 1
andf
is a pointer to member data of a classT
andt1
is not one of the types described in the previous item;—
f(t1, t2, ..., tN)
in all other cases.
The first two options allow both a reference and a pointer.
The important thing to notice here is that the wording does not limit you to plain pointers. You could use a std::shared_ptr
or some other smart pointer to keep your instance alive while bound and it would still work with std::bind
as t1
is dereferenced, no matter what it is (given, of course, that it's possible).
Solution 2:
To add to the correct answer (that both forms are allowed).
I think of the two binding options in analogy with function argument declaration, which may be "passed by value" or "passed by reference".
In the case of f1
(aka passing my_foo
"by value") the result doesn't "see" any changes made to my_foo
past the binding point. This may not be desired especially if my_foo
evolves. "By value" binding has an additional "cost" of (several) calls to a copy constructor.