Non-fonctions membres statiques sans ref-qualifier

C'est une suite à mon précédent post

Avec référence à la Non-fonctions membres statiques

En vertu de

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

Pour aller encore plus loin, j'ai testé le code source fourni dans le lien ci-dessus, comme indiqué ci-dessous:

#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;
}

J'ai fourni des commentaires au-dessus de chaque non-membre statique de la fonction de surcharge basée sur le qualificatif de référence, en mettant en évidence la compilation question qui se produirait si seulement cette surcharge ont à être activé, en vue de le code source de main().

Ma question est, ce qui se passe sous le capot pour le non-réf qualifié non-statique de la fonction de membre pour pouvoir être agnostique à l'implicite du type de l'objet sur lequel elle est invoquée? Le compilateur étape avec la surcharge?

Apprécier vos pensées.

+2
2019-09-17 08:21:34
source
1 réponses

Vous devez initialiser addr_len à la taille de addr.

Si vous regardez la page de manuel pour accepter, en vertu de la répertoriés errno valeurs; EINVAL addrlen est invalide (e. g. est négatif)

(soufflé l'esprit): ce n'est pas les mêmes arguments.

Vous vous appelez malloc() qui pourrait revenir à la mémoire non initialisée.

Quelle que soit la valeur que vous définissez addrlen à combien d'octets de l'adresse peut être copiée dans l'adresse; 0 signifie aucun.

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

Voir d'autres questions sur les étiquettes