Características C++11 (C++ moderno)

Este documento describe las características de la nueva norma-también de C++ conocida como C++11-that se implementa en Visual C++.

Características de lenguaje básicas C++11

Visual C++ 2010 implementó muchas características en la especificación básica del lenguaje C++0x, a la que fue el predecesor C++11, y Visual C++ en Visual Studio 2012 expanda en que para incluir muchas características C++11.La tabla siguiente se muestran las características de lenguaje básicas C++11 y su estado de implementación en Visual C++ 2010 y Visual C++ en Visual Studio 2012.

Características de lenguaje básicas C++11

V C10

V C11

Referencias v0.1 Rvalue v1.0v2.0v2.1, v3.0

v2.0

v2.1*

referencia-calificadores

No

No

inicializadores no estáticos del miembro de datos

No

No

Plantillas v0.9 de Variadic, v1.0

No

No

Las listas de inicializadores

No

No

assert

auto v0.9, v1.0

v1.0

v1.0

Tipos de valor devuelto finales

Las expresiones lambda v0.9v1.0, v1.1

v1.0

v1.1

, decltype v1.0v1.1

v1.0

v1.1 **

Paréntesis angular

Argumentos de plantilla predeterminados para las plantillas de función

No

No

Expresión SFINAE

No

No

Plantillas de Alias

No

No

Plantillas Extern

nullptr

Enumeraciones fuertemente tipados

Partial

Forward declarado enumeraciones

No

Atributos

No

No

constexpr

No

No

Alineación

TR1

Partial

Constructores delegados

No

No

Herencia de constructores

No

No

Operadores de conversión explícitos

No

No

char16_t

No

No

Literales de cadena Unicode

No

No

Literales de cadena sin formato

No

No

Nombres de carácter universal en literales

No

No

Literales definido por el usuario

No

No

Norma-diseño y tipos triviales

No

Funciones establecidas como valor predeterminado y eliminan

No

No

Declaraciones extendidas de confianza

Extendido

No

No

Espacios de nombres en línea

No

No

Uniones sin restricción

No

No

Tipos locales e sin nombre como argumentos de plantilla

para-bucle Intervalo-basado

No

reemplazo y finales v0.8v0.9, v1.0

Partial

Compatibilidad mínima GC

noexcept

No

No

Características de lenguaje básicas C++11: Simultaneidad

V C10

V C11

Puntos de secuencia repetidos

N/D

N/D

Física nuclear

No

Para comparar y cambie

No

Barreras bidireccionales

No

Modelo de memoria

N/D

N/D

el orden de la Dato- dependencia

No

el orden de la Dato- dependencia: anotación de función

No

No

exception_ptr

quick_exit

No

No

Física nuclear en controladores de señal

No

No

Almacenamiento local de subprocesos

Partial

Partial

Estática mágica

No

No

Características de lenguaje básicas C++11: C99

V C10

V C11

__func

Partial

Partial

Preprocesador de C99

Partial

Partial

de largo

Tipos enteros extendidos

N/D

N/D

Ésta es una guía rápida a la información de las tablas.

Hh567368.collapse_all(es-es,VS.110).gifReferencias Rvalue

N1610 “Clarification de inicialización de objetos de clase por los valores r” era un intento temprano de habilitar la semántica de transferencia de recursos sin referencias rvalue.En este tutorial, se denominará “rvalue hace referencia v0.1.” Se ha reemplazado por “referencias v1.0 rvalue.” “Rvalue hace v2.0 referencia”, que es lo que se basaba el trabajo en Visual C++ 2010 en, prohíbe referencias rvalue enlazarlos a los son y por tanto para corregir un problema de seguridad importante. "Las referencias v2.1 Rvalue “refinan esta regla.Considere vector<string>::push_back(), que tiene las sobrecargas push_back(const string&) y push_back(string&&); la llamada v.push_back("strval").La expresión "strval" es un literal de cadena, y es un valor l.(Otros literales, por ejemplo el entero 1729, son valores r, pero los literales de cadena son especiales porque son matrices). Las reglas de las referencias v2.0 rvalue dijo, string&& no puede enlazar a "strval" porque "strval" es un valor l y, por consiguiente, push_back(const string&) es la única sobrecarga viable.Esto crearía std::string temporal, se copia en el vector, y después destruye std::string temporal.Esto no es muy eficaz.Las reglas de las referencias v2.1 rvalue reconocen que enlazar string&& a "strval" crearía std::string temporal, y que temporal es un valor rvalue.Por consiguiente, push_back(const string&) y push_back(string&&) son viables, y se prefiere push_back(string&&).std::string temporal se crea, y se mueve a vector.Esto es más eficaz.

“Las referencias v3.0 Rvalue” agregan nuevas reglas para generar automáticamente constructores de movimiento y mover a operadores de asignación en determinadas condiciones.Sin embargo, esto no se implementa en Visual C++ en Visual Studio 2012, debido a restricciones de tiempo y de recursos.

Nota de precauciónPrecaución

Los v0.1, v1.0, v2.0, v2.1, designaciones v3.0 se inventan para mayor claridad y mostrar la evolución de C++11.

Hh567368.collapse_all(es-es,VS.110).gifLambdas

Después de que funciones lambda fuera votado en el Paper que funcionaba (versión 0,9) y las expresiones lambda mutables se agregaron (versión 1,0), el comité de Standardization revisada el texto.Esto genera lambdas versión 1,1.Esto produce demasiado tarde para mostrarlo en línea en Visual C++ 2010, pero está en Visual C++ en Visual Studio 2012.El texto de las expresiones lambda v1.1 explica qué debe aparecer en los casos de la esquina como de hacer referencia a los miembros estáticos o a las expresiones lambda anidada.Esto corrige los errores que son desencadenados por lambdas complejos.Además de Visual C++ en Visual Studio 2012, las expresiones lambda estado son convertibles a punteros a función.Esto no está en el texto N2927, pero se cuentan como parte de las expresiones lambda v1.1 de todos modos.FDIS 5.1.2 []/6 de expr.prim.lambda tiene esta descripción: “El tipo de cierre para obtener una expresión lambda sin lambda- captura tiene una función de conversión no explícita no virtual pública const al puntero a función tiene el mismo parámetro y tipos de valor devuelto que el operador de llamada de función del tipo de cierre.El valor devuelto por esta función de conversión de la dirección de una función que, cuando se invoca, tiene el mismo efecto que al operador de llamada de función del tipo de cierre”. ( Visual C++ en Visual Studio 2012 incluso es mejor que, dado que hemos creado lambdas estado convertibles a punteros a función que tienen convenciones de llamada arbitrarias.Esto es importante cuando se utiliza API que cuenta con elementos como los punteros a función de __stdcall .)

Hh567368.collapse_all(es-es,VS.110).gifdecltype

Después de que el decltype fuera votado en el Paper que funcionaba (versión 1,0), recibió una corrección de errores pequeña pero importante a actualizada (versión 1,1).Esto es de gran interés para los programadores que trabajan en STL y el Boost.

Hh567368.collapse_all(es-es,VS.110).gifEnumeraciones fuertemente tipados/hacia delante declarados

Enumeraciones fuertemente tipados se admiten parcialmente en Visual C++ 2010 (específicamente, la parte sobre tipos subyacentes especificados explícitamente).Visual C++ en Visual Studio 2012 los completamente implementado, y también implementa totalmente la semántica C++11 para reenvíe las enumeraciones declarados.

Hh567368.collapse_all(es-es,VS.110).gifAlineación

Ni Visual C++ 2010 ni implementar de Visual C++ en Visual Studio 2012 las palabras clave básicas alignas/alignofofrecen de alineación programado que se votado en el Paper que funcionaba.Visual C++ 2010 tenía aligned_storage de TR1.Visual C++ en Visual Studio 2012 agrega aligned_union y std::align() a la biblioteca estándar.

Hh567368.collapse_all(es-es,VS.110).gifNorma-diseño y tipos de Trivial

Los cambios expuestos de “VAINA N2342 nueva; Resolver el punto central 568 (revisión 5)” son las adiciones de is_trivial y de is_standard_layout a <type_traits>.(N2342 devueltos a la del texto básica de idioma, pero no hay cambios de compilador necesarios). Estos rasgos de tipo estaban disponibles en Visual C++ 2010, pero terminan de duplicar is_pod.Por consiguiente, la tabla anterior en este documento dijo “no” compatibilidad.En Visual C++ en Visual Studio 2012, son accionados por los enlaces de compilador que están diseñados para permitir respuestas exactas.

Hh567368.collapse_all(es-es,VS.110).gifreemplazo y final

Esto pasa con una evolución corta pero complicada., En versión 0,8, había originalmente [[override]], [[hiding]], y [[base_check]] atributos.A continuación en versión 0,9, los atributos eliminados y reemplazan con palabras clave contextuales.Por último, en versión 1,0, se reducidos a “final” en clases, y “override” y “final” en funciones.Esto le crea una extensión de Ascended porque Visual C++ 2010 admitía ya esta sintaxis de “override” en funciones, y tenía semántica bastante cerca de los de C++11. "final” también se admite, pero mediante diferente ortografía “selló”.En Visual Studio 2012, la ortografía y la semántica estándar de “override” y “final” se admiten por completo.Para obtener más información, vea override (especificador) y final (especificador).

Hh567368.collapse_all(es-es,VS.110).gifFísica nuclear, y Más

Física nuclearpara comparar y cambiebarreras bidireccionales, y el orden de la dato- dependencia especifique la maquinaria de la biblioteca estándar, que se implementan en Visual C++ en Visual Studio 2012.

Hh567368.collapse_all(es-es,VS.110).gifCaracterísticas estándar de biblioteca

Que cubre el lenguaje básico.En cuanto a la biblioteca estándar C++11, no tenemos una tabla descriptiva de características, pero Visual C++ en Visual Studio 2012 la implementa, con dos excepciones.Primero, cuando una característica de biblioteca depende de la funcionalidad que falta en el compilador, cualquiera simulamos a requerir- para el ejemplo, se simula las plantillas variadic para make_shared<T>()— o no lo implementamos - que estamos pocos casos, sobre todo, <initializer_list>.En segundo lugar, la biblioteca estándar de C99, que es escrita por referencia de la biblioteca estándar C++11, es principalmente implementados, aunque <stdint.h> fuera implementado en Visual C++ 2010.A continuación se muestra una lista parcial de los cambios en Visual C++ en Visual Studio 2012:

Nuevos encabezados:<atomic>, <chrono>, <condition_variable>, <future>, <mutex>, <ratio>, <scoped_allocator>, y <thread>.

Emplazamiento: As Requerido Por C++11, emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() se implementa en todos los contenedores para los números “arbitrarios” de argumentos (vea la sección “false variadics”).Por ejemplo, vector<T> tiene “template <typename... Args> void emplace_back(Args&&... args)” que construye directamente un elemento de tipo t en la reproducción del vector de un número arbitrario de argumentos arbitrarios, reenviado perfectamente.Esto puede ser más eficaz que push_back(T&&), que implican una construcción y una destrucción adicionales de movimiento.

**False variadics:**Visual C++ en Visual Studio 2012 tiene un nuevo esquema para simular las plantillas variadic.En Visual C++ 2008 SP1 y Visual C++ 2010, los subheaders estaban incluidos repetidamente con las macros definidas diferente cada vez, las sobrecargas de marca out para 0, 1, 2, 3, o varios argumentos.Por ejemplo, <memory> incluía el subheader interno <xxshared> repetidamente, el registro out make_shared<T>(args, args, args).En Visual C++ en Visual Studio 2012, se van los subheaders.Ahora las plantillas variadic propios se definen como macros (con las partes de barra diagonal inversa- continuaciones), y se expanden utilizando las macros principales.Este cambio interno de implementación tiene estos efectos:

  • El código es más fácil de mantener, más fácil de utilizar (los subheaders de suma eran una cantidad no despreciable de trabajo), y más legible.

  • ¡Es más difícil entrar en con el depurador- triste!

  • El constructor de pair(piecewise_construct_t, tuple<Args1...>, tuple<Args2...>) de std::pair tiene efectos “interesantes”.Esto requiere las sobrecargas N^2 (si admitimos hasta 10 tuplas, esas significa 121 sobrecargas, porque las tuplas vacíos cuentan aquí, también).

Mandando spam out en muchas sobrecargas de par- tupla, además de todas las sobrecargas de ellas, consumió una enorme cantidad de memoria durante la compilación.Por consiguiente, redujimos infinito.En Visual C++ 2008 SP1 y Visual C++ 2010, infinito fuera 10 (es decir, las plantillas “variadic” admitidos 0 a 10 argumentos, inclusivos).De forma predeterminada, infinito es 5 en Visual C++ en Visual Studio 2012.Esto coloca el consumo de memoria del compilador de nuevo cuál era en Visual C++ 2010.Si necesita más argumentos (por ejemplo, si tiene código existente que usa 6 tuplas), hay un sombreado de escape.Puede definir _VARIADIC_MAX proyecto- ancho entre 5 y 10 inclusive.Esto utiliza más memoria, y puede requerir que se usa la opción del compilador /Zm de reservar más espacio para los encabezados precompilados.

**Aleatoriedad:**uniform_int_distribution es absolutamente imparcial ahora, y shuffle() se implementa en <algorithm>, que acepta directamente el número aleatorio uniforme Generadores como mersenne_twister.

Resistencia dirección-de sobrecargado operators: C++98/03 prohibió un elemento de un contenedor de STL de sobrecarga del dirección- de operator.Esto es lo que realizan las clases como CComPtr, de modo que las clases auxiliares como CAdapt fueran necesarias al proteger STL de estas sobrecargas.Durante el desarrollo de Visual C++ 2010, STL cambia creado que rechaza a dirección- de sobrecargado operators en incluso más escenarios.C++11 cambió los requisitos para crear a dirección- de sobrecargado operators aceptable.C++11, y Visual C++ 2010, proporcionan la función std::addressof() auxiliar, que se puede obtener la dirección real de un objeto independientemente de sobrecarga de operadores.Antes de que Visual C++ 2010 fuera liberado, se intenta reemplazar apariciones de “&elem” con “std::addressof(elem)”, que es adecuado resistente.En Visual C++ en Visual Studio 2012, hemos ido más consultas.Ya hemos auditado todos los contenedores y todos los iteradores, de modo que las clases que sobrecargan al dirección- de operator deben utilizar en STL.

Visual C++ en Visual Studio 2012 va más allá de C++11 de varias maneras:

Iteradores de SCARY: permitida pero no requerido por C++11 standard, iteradores de SCARY se ha implementado, como se describe por Dependencias de N2911 “Minimizing dentro de las clases de Genéricos para los programas de Faster y de Smaller” y “Asignar y inicialización, la revisión 1 " del iterador de SCARY N2980.

El encabezado del El sistema de archivos: The <filesystem> de la propuesta TR2 se ha agregado.Proporciona recursive_directory_iterator y otras características interesantes.Antes de que el trabajo en TR2 fuera inmovilizado porque C++0x ejecutaba muy tarde y modificando a C++11, ofrecen 2006 se deriva de Boost.Filesystem V2.Se desarrolló más adelante en Boost.Filesystem V3, pero no se implementa en Visual C++ en Visual Studio 2012.

¡Y una optimización importante!Todos los contenedores son óptimo pequeños ahora con sus representaciones actuales.Esto hace referencia a los objetos contenedores propios, no al señalar- a contenido.Por ejemplo, std::vector contiene tres punteros sin formato.En Visual C++ 2010, el modo de lanzamiento x86, std::vector fuera 16 bytes.En Visual C++ en Visual Studio 2012, es de 12 bytes, que es óptimo pequeño.Éste es un grande trato- si tiene 100.000 vectores del programa, Visual C++ en Visual Studio 2012 se guardará 400.000 bytes.El uso de memoria baja ahorra espacio y tiempo.

Esto se logra eludir el almacenamiento de asignadores vacíos y de comparadores, porque std::allocator y std::less no tienen estado.(Estas optimizaciones se habilitan para los asignadores personalizados o los comparadores también, mientras se estado.Naturalmente, el almacenamiento de asignadores con estado y de comparadores no se puede evitar, pero los son muy raros.)

Hh567368.collapse_all(es-es,VS.110).gifTamaños de contenedor

Las tablas siguientes muestran los tamaños de contenedor, en bytes, para x86 y plataformas x64.(ARM de 32 bits es equivalente a x86 para estos propósitos).Modo de lanzamiento de baraja de estas tablas, porque el modo de depuración contiene comprobar la maquinaria que utiliza el espacio y tiempo.Las columnas independientes son para Visual C++ 2008 SP1, donde _SECURE_SCL estableció como valor predeterminado a 1, y para Visual C++ 2008 SP1 con _SECURE_SCL establece manualmente en 0 para la velocidad máxima.Visual C++ 2010 y Visual C++ en Visual Studio 2012 tienen como valor predeterminado _SECURE_SCL a 0 (ahora conocido como _ITERATOR_DEBUG_LEVEL).

tamaños de contenedor x86 (bytes)

V C9 SP1

V C9 SP1

SCL=0

V C10

V C11

vector<int>

24

16

16

12

matriz<int, 5>

20

20

20

20

deque<int>

32

32

24

20

forward_list<int>

N/D

N/D

8

4

lista<int>

28

12

12

8

priority_queue<int>

28

20

20

16

cola<int>

32

32

24

20

pila<int>

32

32

24

20

pares<int, int>

8

8

8

8

tupla<int, int, int>

16

16

16

12

mapa<int, int>

32

12

16

8

multimap<int, int>

32

12

16

8

establezca<int>

32

12

16

8

conjunto múltiple<int>

32

12

16

8

hash_map<int, int>

72

44

44

32

hash_multimap<int, int>

72

44

44

32

hash_set<int>

72

44

44

32

hash_multiset<int>

72

44

44

32

unordered_map<int, int>

72

44

44

32

unordered_multimap<int, int>

72

44

44

32

unordered_set<int>

72

44

44

32

unordered_multiset<int>

72

44

44

32

string

28

28

28

24

el wstring

28

28

28

24

tamaños de contenedor x64 (bytes)

V C9 SP1

V C9 SP1

SCL=0

V C10

V C11

vector<int>

48

32

32

24

matriz<int, 5>

20

20

20

20

deque<int>

64

64

48

40

forward_list<int>

N/D

N/D

16

8

lista<int>

56

24

24

16

priority_queue<int>

56

40

40

32

cola<int>

64

64

48

40

pila<int>

64

64

48

40

pares<int, int>

8

8

8

8

tupla<int, int, int>

16

16

16

12

mapa<int, int>

64

24

32

16

multimap<int, int>

64

24

32

16

establezca<int>

64

24

32

16

conjunto múltiple<int>

64

24

32

16

hash_map<int, int>

144

88

88

64

hash_multimap<int, int>

144

88

88

64

hash_set<int>

144

88

88

64

hash_multiset<int>

144

88

88

64

unordered_map<int, int>

144

88

88

64

unordered_multimap<int, int>

144

88

88

64

unordered_set<int>

144

88

88

64

unordered_multiset<int>

144

88

88

64

string

40

40

40

32

el wstring

40

40

40

32

Guía de referencia rápida a números de versión de Visual C++

Visual C++ incluye diferentes “números de versión” dependiendo de dónde se fija.Existe la versión calificada (impresa en el cuadro), la versión interna (mostrado en el cuadro de diálogo Sobre ), y la versión del compilador (mostrada por cl.exe y la macro de _MSC_VER ).

Número de versión calificado

Número de versión interno

número de versión de #define _MSC_VER

Visual C++ 2005

V C8

1400

Visual C++ 2008

V C9

1500

Visual C++ 2010

V C10

1600

Visual C++ en Visual Studio 2012

V C11

1700

La macro de _MSC_VER es apropiada para las personas que desean a distintas versiones principales del destino de Visual C++ y emiten código diferente para ellos.

Vea también

Referencia

Expresiones lambda en C++

Instrucción for basada en intervalo (C++)

Otros recursos

Bienvenido a C++ (C++ moderno)

Referencia del lenguaje C++

Referencia de la biblioteca estándar de C++

Blog del equipo de Visual C++