I have watched a talk (exact timestamp, not explained by him) by Nicolai Josuttis (member of C++ standard committee) and he stated that getters should be written like so:
const std::string& getName() const&
{
return memberStringVar;
}
Ever since C++11. The question is, what is the difference comparing to this getter?
const std::string& getName() const
{
return memberStringVar;
}
In the example given in the talk, there are two overloads of getName()
given.
One with the &&
and the other with the const&
qualifiers.
Without the &
after the const
, the function const std::string& getName() const
cannot be overloaded with the overload for rvalues string Customer::getName() &&
.
You would then have to remove the rvalue overload from the code completely if you want it to work.
Since ref qualified member functions were added only in C++11 (making the getter for rvalues possible), the change from const std::string& getName() const
to const std::string& getName() const&
was needed to make both overloads possible.
The C++17 standard draft n4659 states :
16.1 Overloadable declarations [over.load]
...2 Certain function declarations cannot be overloaded:
...
(2.3) — Member function declarations with the same name and the same parameter-type-list as well as member function template declarations with the same name, the same parameter-type-list, and the same template parameter lists cannot be overloaded if any of them, but not all, have a ref-qualifier.
Since there is one overload of getName()
with a ref-qualifier (&&
), the other one also should have the ref qualifier. This is why const&
is required.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With