c++ - que - token de seguridad
¿Cuál es el significado de "......" token? es decir, operador de doble elipsis en el paquete de parámetros (2)
Cada instancia de esa rareza se combina con un caso de puntos suspensivos únicos regulares.
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes...)>
{ typedef _Res result_type; };
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes......)>
{ typedef _Res result_type; };
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes...) const>
{ typedef _Res result_type; };
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes......) const>
{ typedef _Res result_type; };
Mi suposición es que la doble elipsis es similar en significado a _ArgTypes..., ...
, es decir, una expansión de plantilla variadica seguida de una lista varargs estilo C.
Aquí hay una prueba que respalda esa teoría ... Creo que tenemos un nuevo ganador para el peor pseudooperador de todos los tiempos.
Editar: Esto parece ser conforme. §8.3.5 / 3 describe una forma de formar la lista de parámetros como
parameter-declaration-list opt ... opt
Entonces, la doble elipsis está formada por una lista de declaración de parámetros que termina con un paquete de parámetros, seguido de otra elipsis.
La coma es puramente opcional; §8.3.5 / 4 dice
Donde sintácticamente correcto y donde "..." no es parte de un declarador-abstracto, ", ..." es sinónimo de "...".
Esto está dentro de un declarador de resumen, [edit] pero Johannes hace un buen punto que se están refiriendo a un declarador de resumen dentro de una declaración de parámetro. Me pregunto por qué no dijeron "parte de una declaración de parámetro" y por qué esa oración no es solo una nota informativa ...
Además, va_begin()
en <cstdarg>
requiere un parámetro antes de la lista varargs, por lo que el prototipo f(...)
específicamente permitido por C ++ es inútil. Referencias cruzadas con C99, es ilegal en la llanura C. Entonces, esto es más extraño.
Nota de uso
A pedido, aquí hay una demostración de la doble elipsis:
#include <cstdio>
#include <string>
template< typename T >
T const &printf_helper( T const &x )
{ return x; }
char const *printf_helper( std::string const &x )
{ return x.c_str(); }
template< typename ... Req, typename ... Given >
int wrap_printf( int (*fn)( Req... ... ), Given ... args ) {
return fn( printf_helper( args ) ... );
}
int main() {
wrap_printf( &std::printf, "Hello %s/n", std::string( "world!" ) );
wrap_printf( &std::fprintf, stderr, std::string( "Error %d" ), 5 );
}
Mientras navegaba a través de la implementación actual de gcc de los nuevos encabezados C ++ 11, tropecé con el símbolo "......". Puede verificar que el siguiente código compila bien [a través de ideone.com].
template <typename T>
struct X
{ /* ... */ };
template <typename T, typename ... U>
struct X<T(U......)> // this line is the important one
{ /* ... */ };
Entonces, ¿cuál es el significado de este token?
editar: Parece que SO recortado "......" en el título de la pregunta a "...", realmente quise decir "......". :)
en la coma de separación vs2015 es esencial en la versión de la plantilla:
template <typename T, typename ... U>
struct X<T(U...,...)> {};// this line is the important one
una ejemplificación de ejemplo es:
X<int(int...)> my_va_func;
Saludos, FM.