Descuidados clase "miembros especiales" - función de transferencia

Una, la sobrecarga de operadores

Esta palabra clave no es muy habitual, de hecho, casi agotada, pero esto sucede palabras clave y nuevos / borrar la clase fue retirado palabras clave a menudo aparecen juntos, de modo que toda la apariencia situación aún más extraña. Antes debe buscar en la biblioteca stl C ++ visto en el miembro de la clase de encargo en la función de transferencia, se espera para hacer que un objeto se puede convertir a tipo bool (por lo general utilizado en una expresión lógica si la clase). Se convirtió para ver esta función cuando se retira y otro de STL :: TR1 extensión del conjunto funcional. Como todos sabemos, la función es todo STL ideales (aunque un número diferente de parámetros) algo que puede ser invocada (clases functor, funciones) envasados como una forma de puntero de función unificada externa. Dado que es una función del ideal, entonces es mejor capaz de juzgar si es un puntero nulo, que puede expresarse como características bool.
Tenga en cuenta que el uso de las dos clases siguientes de operador, tienen el mismo aspecto, relativamente confundirse fácilmente, pero son dos sintaxis estructura completamente diferente / semántica, es una función de conversión, es una función del operador. Desde el punto de vista lingüístico, la más obvia de las cuales es una características gramaticales de palabras clave se inicia la guía del operador, el otro tipo es el comienzo de la guía.
4.4.7-gcc \ libstdc ++ - v3 \ incluyen la \ tr1_impl \ funcional
función de clase ///
plantilla <nombre de tipo _res, nombretipo ... _ArgTypes>
función de la clase <_res (_ArgTypes ...)>
: _Maybe_unary_or_binary_function público <_res, _ArgTypes. ..>,
privada _Function_base
{
......
// [3.7.2.3] capacidad función

/ **
* @brief Determinar si la envoltura función% tiene un objetivo.
*
* @Return @c cierto cuando este objeto función% contiene un objetivo,
* o falsa @c cuando está vacío.
*
* Esta función no será una excepción.
* /
Operador _Safe_bool () const
{
si (_M_empty ())
return 0;
otra
vuelta y _Hidden_type :: _ M_bool;
}

// [3.7.2.4] invocación de la función

/ **
* @brief invoca la función dirigida por @c * esto.
* @Returns el resultado del objetivo.
* @Throws bad_function_call cuando @c! (Bool) * esta
*
* El operador llamada a la función invoca la función del objeto de destino
* almacenado por @c esto.
* /
Operador _res () (_ ArgTypes ... __args) const;
......
}

Dos, C ++ descripción de la sintaxis de las dos estructuras

En el "C ++ 11-draft-starndard.pdf " , para guiar el segundo sintaxis se llama "función-operador-ID"
operador-función-ID:
OPERADOR operador
OPERADOR: Uno de
nuevo nuevo Delete nuevo nuevo [] delete []
? | - + * /% y
! = <> + == * = / =% =
! = y = | = << >> << >> = = = ==
<=> = && || + + - -> * ->
() []
se define para la sintaxis de conversión de función-id es tal una
conversión de función-id:
operador de conversión de tipo Id de
sólo estos dos estructura gramatical, se es comenzó el operador, pero al analizar, su diferencia es obvia. De aquí para entender el concepto, el operador función-id y los mismos que los nombres de funciones ordinarias, operador y operadores juntos como una unidad atómica de la gramática, su significado y los mismos que los nombres de funciones ordinarias. Intuitivamente puede decir: los que pueden aparecer función ordinaria, el nombre de la función se sustituye por "operador operador +" son posibles.
tsecer @ Harry: Gato operator.function.id -n.




. 5 de retorno X * X;
. 6}
. 7 int MUL (int X)
. 8 {
. 9 retorno X * X;
10}
11};.
12 es
13 es int operador + (const A & A, int X)
14 {
15 de retorno X + X;
16}
. el Agregar int 17 (A & A const, int X)
18 es {
. 19 de retorno X + X;
20 es}
21 es
22 es una A;
23 es int main ()
24 {
25 retorno a.operator * (. 1) a.mul + + (1). operador + (un ,. 1) + el botón Añadir (un ,. 1);
26} es
tsecer @ Harry: GCC -C operator.function.id.cpp
tsecer @ Harry:
véase más arriba fragmento de código se puede ver, "operador *" y " operador + "como un todo, y añadir la correspondiente mul respectivamente, que son gramaticalmente equivalente, que son el tipo más avanzado de unidades sin reservas-id de sintaxis, sus identificadores y identificador literal el mismo nivel, pero en el léxico describir las diferentes reglas
primario-expresión:
literal
este
(expresión)
id-expresión
lambda-expresión
id-expresión:
sin reservas-id
calificado-id
no calificado-id:
identificador de
operador-función-id
conversión de función-id
literal-operador-id
~ class-name
~ decltype-especificador
plantilla -carné de identidad

Tres, explicación C ++ para la función de conversión

Desde el punto de vista de la organización del directorio, la conversión es un especial de funciones miembro y constructor / destructor mismos en el mismo directorio, pero ctor / dtor más comúnmente utilizado para encubrir la conversión, en lugar de la conversión indigno del nombre. Razonan su tío que en realidad están no guían el uso de la declaración de tipo. Constructor ejemplo, se identifica por el nombre de la clase y de la misma localidad; destructor se debe al inicio de la '~', y no se requiere la conversión correspondiente al principio de 'operador', el reconocimiento de palabras clave.
12 Funciones miembros especiales 256
12.1 Constructores ........................................... . 256
12.2 los objetos temporales ......................................... 258
12.3 Conversiones. ............................................ 261
12.4 Los destructores ... .......................................... 264
12.5 tienda libre. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
12.6 Inicialización. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
12.7 Construcción y destrucción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
12,8 copiar y mover objetos de clase. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
12,9 constructores Herencia de. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Si una función de conversión es una función miembro, las
“funciones 12.3.2 de conversión”中对于转换函数的定义
tipo de la función de conversión (8.3.5) es la “función de tomar ningún parámetro de regresar de conversión de tipo-id”.

Cuatro, el trato especial gcc para los miembros de la clase

Aquí solamente tener en cuenta que: la conversión interna gcc y es de hecho el ctor / DTOR procesada simultáneamente, lo que indica que la conversión se pasa por alto pero no es realmente una estructura de base / miembro de un destructor de clase en particular, entonces alta frecuencia de uso.
4.4.7-CCG \ GCC \ CP \ parser.c
estática cp_declarator *
cp_parser_direct_declarator (cp_parser * Analizador,
cp_parser_declarator_kind dcl_kind,
int * ctor_dtor_or_conv_p,
member_p BOOL)
{
......
SI (class_type)
{
SI (TREE_CODE (unqualified_name) == BIT_NOT_EXPR)
SFK = sfk_destructor;
el else if (IDENTIFIER_TYPENAME_P (unqualified_name))
SFK = sfk_conversion;
el else if (/ * No apos no hay manera de declarar un constructor
para el tipo de un anónimo, el aun si el tipo de
nombre de GOT a de vinculación propósitos * /.
TYPE_WAS_ANONYMOUS (class_type! )
&& constructor_name_p (unqualified_name,
class_type))
{
unqualified_name = constructor_name (class_type);
sfk = sfk_constructor;
}

si (ctor_dtor_or_conv_p && sfk = sfk_none!)
* ctor_dtor_or_conv_p = -1;
}
......
}

En quinto lugar, utilice ejemplo sencillo

Tenga en cuenta que en este ejemplo la función de la diversión es un puntero de objeto en lugar de una convencional
tsecer @ Harry: CAT function.cpp
# include <Tr1 / Funcional>

std :: TR1 :: función <void) (> diversión;

int main ()
{
si (diversión!)
{
retorno 123;
}
Return 0;
}
Tsecer @ Harry:
tsecer @ Harry: cat -n function.cpp
1 #include <TR1 / funcional>
2
3 std :: TR1 :: función <void) (> diversión;
4
5 int main ()
6 {
7 si (diversión!)
8 {
9 de retorno 123;
10}
11 return 0;
12}
tsecer @ Harry: g ++ -g function.cpp
tsecer @ Harry: ./a.out
tsecer @ Harry: $ echo?
123
tsecer @ Harry: BGF ./a.out
GNU GDB (BGF) de Red Hat Enterprise Linux 7.6.1-80.el7
Copyright (C) 2013 Free Software Foundation, Inc.
Licencia GPLv3 +: GNU GPL versión 3 o posterior <http://gnu.org/licenses/gpl.html>
Este es software libre: usted es libre de cambiar y redistribuirlo.
No hay ninguna garantía, en la medida permitida por la ley. Tipo "VER copiar"
y "programa de garantía" para más detalles.
Este GDB se ha configurado como "x86_64-redhat-linux-gnu".
Para el bug instrucciones de informe, véase:
<http://www.gnu.org/software/gdb/bugs/> ...
símbolos de lectura /home/harry/study/cpp.rvalue/a.out...done .
(GDB) b 7
Breakpoint 1 a 0x400604: function.cpp archivo, la línea 7.
(GDB) r
programa de inicio: /home/harry/study/cpp.rvalue/./a.out

Punto de interrupción 1, main () en function.cpp: 7
7 si (diversión!)
Falta debuginfos separadas, utilice: debuginfo a instalar glibc-2.17-196.tl2.3.x86_64 libgcc-4.8.5-4.el7.x86_64 libstdc ++ -4.8.5-4.el7.x86_64
(BGF) si
0x0000000000400609 7 if (! diversión)
(BGF)
std :: TR1 :: función <vacío ()> operador :: std :: TR1 :: función <vacío () > :: _ Hidden_type * std :: TR1 :: función <vacío ()> _ Hidden_type :: :: * () const (esto = 0x400510 <_start>) en /usr/include/c++/4.8.2/tr1/functional: 2048
const 2048 _Safe_bool operador ()
lista (BGF)
2043 * /
2044 #if __cplusplus> = 201103L
2045 bool operador explícita () const
2046 _M_empty {return (!); }
2047 #else
2048 _Safe_bool operador () const
2049 {
2050 si (_M_empty ())
2051 return 0;
2052 lo demás
(BGF) si
0x000000000040070f 2.048 operador _Safe_bool () const
(BGF)
0x0000000000400712 2.048 operador _Safe_bool () const
(BGF)
0x0000000000400716 2.048 operador _Safe_bool () const
(BGF)
2050 si (_M_empty ())
(BGF)
0x000000000040071e 2050 si ( _M_empty ())
(gDB)
0x0000000000400721 2,050 si (_M_empty ())
(gDB)
std :: TR1 :: _ Function_base :: _ M_empty (esto = 0x4007ad <__ libc_csu_init + 77>) en /usr/include/c++/4.8.2/ TR1 / funcionales: 1760
1760 bool _M_empty () const {return _M_manager;! }
(BGF) si
0x00000000004006c7 1760 bool _M_empty () const {return _M_manager!; }
(BGF) p _M_manager
$ 1 = (std :: TR1 :: _ :: _ Function_base Manager_type) 0xc35f415e415d415c
(BGF) s
std :: TR1 :: función <vacío ()> operador :: std :: TR1 :: función <vacío () > :: _ Hidden_type * std :: TR1 :: función <vacío ()> _ Hidden_type :: :: * () const (esto = 0x601060 <fun>) en /usr/include/c++/4.8.2/tr1/functional: 2051
2051 return 0;
(BGF) Lista
2046 _M_empty {return (!); }
2047 #else
2048 operador _Safe_bool () const
2049 {
2050 si (_M_empty ())
2051 return 0;
2052 demás
2053 de retorno y _Hidden_type :: _ M_bool;
2054}
2055 #endif
(GDB) portofino
0x0000000000400731 2051 return 0;
(BGF) p _M_manager
$ 2 = (std :: TR1 :: _ :: _ Function_base Manager_type) 0x0
(BGF)

Supongo que te gusta

Origin www.cnblogs.com/tsecer/p/12558312.html
Recomendado
Clasificación