2012-02-05 11 views
5

estoy jugando con la vista previa para desarrolladores de Visual Studio 11.Como muchos argumentos para std :: bind (VC 11 sólo admite 4)

Una de las falencias que he topé es std :: enlazar solo apoyando 4 argumentos de funciones.

No puedo encontrar nada al respecto en el documento de estándares C++ 11. ¿Se definió un número mínimo de argumentos o depende de la implementación?

Respuesta

0

Es un valor dependiente de la implementación. Las implementaciones pueden simplemente colapsar o hacer algo más tonto si excedes la cantidad de argumentos. Las implementaciones reales de C++ 11 usan plantillas variadic aquí (VC++ aún no tiene esa característica), por lo que sus límites deberían ser más que suficientes para todos.

Este es un caso de comportamiento indefinido que excede los límites de implementación. No es diferente de tener un archivo de 1TB intentando alimentar el compilador y se está quedando sin memoria.

+0

'std :: bind' es variadic y' tr1 :: bind' es de arity definido por la implementación, ¿no? El nombre se ve mal. – spraff

+0

@spraff tanto el número de argumentos de plantilla como el número de argumentos de función están sujetos a límites específicos de implementación. –

2

En realidad, esto es una implicación de que VC11 aún no admite plantillas variadic. Sin embargo, podrían codificar más de cuatro. Las bibliotecas de Boost hacen esto todo el tiempo con un texto repetitivo de hasta diez argumentos (verifique las señales2, por ejemplo, en el directorio de detalles). Cuatro argumentos es un número pequeño horrible para detenerse.

7

En VC11, puede aumentar la cantidad de argumentos máximos utilizados por el esquema de emulación de plantillas variadiac configurando _VARIADIC_MAX. Por defecto es 5.

Ver aquí: http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx

Si necesita más argumentos (por ejemplo, que tenía una compilación del código con SP1 VC9 o VC10 que utiliza 6-plas), hay una vía de escape. Puede definir _VARIADIC_MAX en todo el proyecto entre 5 y 10 inclusive (por defecto es 5). Aumentarlo hará que el compilador consuma más memoria, y puede que requiera que use la opción/Zm para reservar más espacio para PCHes.

Cuestiones relacionadas