Nicht-statische member-Funktionen ohne ref-Qualifizierer

Dies ist ein follow-up zu meinem vorherigen post

Mit Verweis auf Nicht-statischen member-Funktionen

Unter

const-, volatile-, and ref-qualified member functions

A non-static member function can be declared with no ref-qualifier,... During overload resolution, non-static cv-qualified member function of class X is treated as follows:

no ref-qualifier: the implicit object parameter has type lvalue reference to cv-qualified X and is additionally allowed to bind rvalue implied object argument

Erkunden diese weiter, experimentierte ich mit dem source code aus dem link oben, wie unten gezeigt:

#include <utility>
#include <iostream>
using std::move;
using std::cout;
using std::endl;

struct S {
    void f() {cout << "no ref-qualifier: the implicit object parameter has type lvalue reference to cv-qualified S and is additionally allowed to bind rvalue implied object argument\n"; }

    //if only the below method signature were to be enabled,
    //the invocations using rvalue implicit object would fail
    //to compile with the error [-fpermissive]
    //void f() & {cout << "lvalue\n"; }

    //if only the below method signature were to be enabled,
    //the invocation using lvalue implicit object would fail
    //to complile with the error [-fpermissive]
    //void f() && {cout << "rvalue\n"; }
};

int main (void){

    S s;
    s.f();       // prints "lvalue"
    move(s).f(); // prints "rvalue"
    S().f();          // prints "rvalue"

    return 0;
}

Ich habe relevante Kommentare über jede nicht-statische Memberfunktion überladen basierend auf der Referenz-qualifier, wobei die Zusammenstellung Problem ergeben, wenn nur der jeweilige überlastung wurden versetzt werden, im Blick auf den source-code in main() an.

Meine Frage ist, was geschieht, unter die Motorhauben, um für die non-ref qualifizierte nicht-statische member-Funktion, um in der Lage zu sein, Agnostiker zu der implizite Typ des Objekts, auf das es aufgerufen wurde? Funktioniert der compiler Schritt mit der entsprechenden überlastung?

Schätzen Sie Ihre Gedanken.

+2
2019-09-17 08:21:34
Quelle
1 Antworten

Sie brauchen, um zu initialisieren, addr_len, um die Größe von addr an.

Wenn man sich die manpage zu akzeptieren, unter den aufgeführten errno-Werte; EINVAL, wenn addrlen ist ungültig (e. g. negativ ist)

(durchgebrannt Geist): es ist nicht die gleichen Argumente.

Sie sind Aufruf von malloc() die zurückkehren könnte nicht initialisierten Speicher.

Was auch immer der Wert ist addrlen, um wie viele bytes der Adresse kann kopiert werden, in Adresse; 0 bedeutet keine.

+0
2019-09-17 10:52:17

Sehen Sie sich andere Fragen zu Tags an