Binding and Const Member Functions
How does std::bind handle const member functions?
When binding member functions using std::bind, the constness of the member function is preserved. If you bind a const member function, the resulting functor will also be const-qualified.
Consider the following example:
#include <functional>
#include <iostream>
struct Player {
std::string GetName() const { return Name; }
std::string Name{"Anna"};
};
int main() {
const Player ConstPlayer;
auto GetConstName{std::bind(
&Player::GetName, &ConstPlayer)};
std::cout << GetConstName();
}AnnaIn this example, GetName() is a const member function of the Player struct. We create a const instance of Player called ConstPlayer.
When we bind &Player::GetName to &ConstPlayer using std::bind, the resulting GetConstName functor is const-qualified. This means that it can be called on const instances of Player.
Whilst we can bind a non-const member function to a const object, we will get a compilation error if we attempt invoke the function:
#include <functional>
#include <iostream>
struct Player {
void SetName(const std::string& NewName) {
Name = NewName;
}
std::string Name;
};
int main() {
const Player ConstPlayer;
auto SetConstName{std::bind(
&Player::SetName, &ConstPlayer, "Aria")};
SetConstName();
}error: attempting to reference a deleted functionIn this case, binding &Player::SetName to &ConstPlayer will result in a compilation error once we invoke the function, because SetName() is a non-const member function and cannot be called on a const object.
Therefore, when binding member functions, it's important to consider the constness of the member function and the object it is being bound to. std::bind ensures that the constness is preserved and enforced appropriately.
Function Binding and Partial Application
This lesson covers function binding and partial application using std::bind(), std::bind_front(), std::bind_back() and std::placeholders.