In C++11 and later, one can decorate the member function with &, const&, oe && (or other combinations).
If one has several overloads, and at least one is specified like this, the others must follow the same convention.
Pre C++11 style:
struct A {
   void f() const {}  // #1
   void f()       {}  // #2
};
C++11 and later:
struct  {
   void f() const& {}  // #3
   void f()      & {}  // #4
// void f()     && {}  // if necessary
};
Until today, I though that #4 was equivalent to #2, but today I found a counter example:
struct A {
   void f()      & {}
// void f()     && {}  // commented for testing purposes, see below
}
struct B {
   void f()        {}
}
...
A{}.f();  // compile error: argument discards qualifiers
B{}.f();  // ok
https://godbolt.org/z/qTv6hMs6e
So, what is the deal? An undecorated (non-const) member function written in the old style is equivalent to both its && or & version depending on the context (at the calling point)?
Is the below code the correct interpretation?
struct B {
   void f() {... some body...}
}
...is the same as this?
struct B {
   void f() & {... some body...}
   void f() && {... some (same) body...}
}
Aucun commentaire:
Enregistrer un commentaire