2011-07-21 13 views
22

Duplicar posibles:
What does the explicit keyword in C++ mean?C++ palabra clave explícita para la función sin argumentos

¿Hay una razón para usar la palabra clave explicit para una función que no toma ningún argumento? ¿Tiene algún efecto? Me pregunto porque me encontré con la línea

explicit char_separator()

cerca del final de la página impulso documentación :: char_separator (http://www.boost.org/doc/libs/1_47_0/libs/tokenizer/char_separator.htm), pero no está explicado más lejos allí.

+6

No es una tontería; esta pregunta se trata de un caso de esquina muy específico de la palabra clave 'explicit'. –

+4

Eso no es una función, eso es un constructor - ver http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean/121163#121163 – Skizz

+0

@larsmans Difícil de decir sin ver algún ejemplo real –

Respuesta

14

lectura explanation of members:

explicit char_separator(const Char* dropped_delims, 
         const Char* kept_delims = "", 
         empty_token_policy empty_tokens = drop_empty_tokens) 
explicit char_separator() 

La palabra clave explicit para la primera constructora requiere la creación explícita de objetos de tipo char_separator. What does the explicit keyword mean in C++? cubre muy bien la palabra clave explícita.

La palabra clave explicit para el segundo constructor es un ruido y se ignora.

EDITAR

Desde el C++ estándar:

7.1.2 P6 dice:

El especificador explícito deberá utilizarse únicamente en las declaraciones de constructores dentro de una declaración de la clase; ver 12.3.1.

12.3.1 p2 dice:

Un constructor explícito construye objetos al igual que no explícitas constructores, pero lo hace sólo cuando la sintaxis de inicialización directa (8,5) o en los moldes (5.2. 9, 5.4) se usan explícitamente. Un constructor predeterminado puede ser un constructor explícito; dicho constructor será utilizado para realizar inicialización por defecto o inicialización de valor (8.5). [Ejemplo:

class Z { 
public: 
explicit Z(); 
explicit Z(int); 
// ... 
}; 
Z a;    // OK: default-initialization performed 
Z a1 = 1;   // error: no implicit conversion 
Z a3 = Z(1);  // OK: direct initialization syntax used 
Z a2(1);   // OK: direct initialization syntax used 
Z* p = new Z(1); // OK: direct initialization syntax used 
Z a4 = (Z)1;  // OK: explicit cast used 
Z a5 = static_cast<Z>(1); // OK: explicit cast used 

-end ejemplo]

Por lo tanto, el constructor por defecto con la palabra clave explicit es el mismo que sin esta palabra clave.

Cuestiones relacionadas