No las funciones miembro estáticas sin ref-qualifier

Esta es una continuación a mi anterior post

Con referencia a la No-funciones miembro estáticas

Bajo

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

Para explorar más a fondo, he experimentado con el código fuente proporcionado en el enlace de arriba, como se muestra a continuación:

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

Me han proporcionado comentarios relevantes sobre cada función miembro no estático de la sobrecarga de la base de referencia calificador, destacando el problema de compilación que se produciría si solo la sobrecarga fueron para ser habilitado, en vista de que el código fuente de main().

Mi pregunta es, ¿qué está sucediendo debajo de la capota para que el no-ref calificado función miembro no estático para ser capaz de ser independiente de los implícito el tipo de objeto sobre el cual ha sido invocado? Hace el compilador paso con la correspondiente sobrecarga?

Apreciar sus pensamientos.

+2
2019-09-17 08:21:34
fuente
1 respuestas

Usted necesita para inicializar addr_len para el tamaño de addr.

Si usted mira en la página del manual para aceptar, bajo el listado de errno valores; EINVAL si addrlen no es válido (e. g. es negativo)

(soplado mente): no es el mismo argumentos.

Usted está llamando malloc() que podría devolver a la memoria sin inicializar.

Cualquiera que sea el valor que se establece addrlen a cuántos bytes de la dirección puede ser copiado en la dirección; 0 significa ninguna.

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

Vea otras preguntas sobre etiquetas