C++17 - La guía completa
C++17 - La guía completa
Sobre este libro
C++17 es la próxima evolución en la programación de C++ moderno, ahora soportado por los compiladores importantes de C++. Aunque la adopción de C++17 no es un paso tan grande como la adopción de C++11, C++17 contiene un gran número de pequeñas y valiosas características del lenguaje y la biblioteca, las cuales soportan y cambian la manera en la que programamos en C++. Como es usual, nada se explica por sí mismo, el combinar nuevas características te da aún más poder, y existen trampas ocultas.
Este libro cubre la motivación para, y el contexto de todas las nuevas características de C++17 (cubre tanto el lenguaje como la biblioteca) con muchos ejemplos e información única de trasfondo para los programadores de aplicaciones y los desarrolladores de bibliotecas. El enfoque es en cómo estas características impactan la programación día a día, qué efecto puede tener combinar estas características y cómo puedes beneficiarte de ellas en la práctica.
“¡Está escrito muy claramente y los ejemplos son muy útiles!” Graham Markall
“Estoy disfrutando el libro minuciosamente; había echado un vistazo a la lista de cambios en C++17 muchas veces antes, pero hasta que empecé a leer este libro, no tenía idea de qué tan sustanciales eran los cambios. ¡Me pone a pensar lo que pasé por alto con actualizaciones anteriores!” Jason Birch
“Pensé que sabía algo de C++. Descargué este libro y aprendí algo nuevo en el prefacio. ¡Hasta ahora altamente recomendado!” Tristan Brindle
Nicolai M. Josuttis es muy famoso en la comunidad de C++ como un conferencista y por escribir con autoridad, siendo el autor de los éxitos de ventas mundiales “The C++ Standard Library - A Tutorial and Reference” y (como coautor) de “C++ Templates - The Complete Guide”. Ha sido un miembro activo del comité de estandarización de C++ por más de 20 años.
Tabla de contenidos
-
-
Prefacio
- Agradecimientos
-
Acerca de este libro
- Lo que debes saber antes de leer este libro
- Estructura general del libro
- Cómo leer este libro
- Terminología de errores
- El estándar C++17
- Ejemplos de código e información adicional
- Retroalimentación
-
Prefacio
-
I Características básicas del lenguaje
-
1. Vínculos estructurados
- 1.1 Vínculos estructurados en detalle
- 1.2 Dónde pueden usarse los vínculos estructurados
- 1.3 Suministrar una API similar a una tupla para vínculos estructurados
- 1.4 Notas posteriores
-
2.
if
yswitch
con un inicializador-
2.1
if
con un inicializador -
2.2
switch
con un inicializador - 2.3 Notas posteriores
-
2.1
-
3. Variables en línea
- 3.1 Motivación de las variables en línea
- 3.2 Usar variables en línea
-
3.3
constexpr
ahora implicainline
para miembros estáticos -
3.4 Variables en línea y
thread_local
- 3.5 Notas posteriores
-
4. Extensiones a agregados
- 4.1 Motivación de la inicialización de agregados extendida
- 4.2 Usar la inicialización de agregados extendida
- 4.3 Definición de agregados
- 4.4 Incompatibilidades con definiciones anteriores
- 4.5 Notas posteriores
-
5. Elisión de copia obligatoria o paso de objetos inmaterializados
- 5.1 Motivación de la elisión de copia obligatoria para temporales
- 5.2 Beneficio de la elisión de copia obligatoria para temporales
- 5.3 Categorías de valor clarificadas
- 5.4 Pasar valor de retorno inmaterializado
- 5.5 Notas posteriores
-
6. Extensiones a lambdas
-
6.1 Lambdas
constexpr
-
6.2 Pasar copias de
this
a lambdas -
6.3 Capturar por referencia
const
- 6.4 Notas posteriores
-
6.1 Lambdas
-
7. Nuevos atributos y características de atributos
-
7.1 Atributo
[[nodiscard]]
-
7.2 Atributo
[[maybe_unused]]
-
7.3 Atributo
[[fallthrough]]
- 7.4 Extensiones generales a atributos
- 7.5 Notas posteriores
-
7.1 Atributo
-
8. Otras caracterÃsticas del lenguaje
- 8.1 Espacios de nombres anidados
- 8.2 Orden de evaluación de expresión definido
- 8.3 Inicialización de enumeraciones desde valores integrales relajada
-
8.4 Inicialización de lista directa con
auto
corregida - 8.5 Literales hexadecimales de punto flotante
- 8.6 Literales de carácter UTF-8
- 8.7 Especificaciones de excepción como parte del tipo
-
8.8
static_assert
con un solo argumento -
8.9 Condición del preprocesador
__has_include
- 8.10 Notas posteriores
-
1. Vínculos estructurados
-
II Características de plantillas
-
9. Deducción de argumentos de plantillas de clase
- 9.1 Uso de la deducción de argumentos de plantillas de clase
- 9.2 Guías de deducción
- 9.3 Notas posteriores
-
10.
if
en tiempo de compilación-
10.1 Motivación de
if
en tiempo de compilación -
10.2 Usar
if
en tiempo de compilación -
10.3
if
en tiempo de compilación con un inicializador -
10.4 Usar
if
en tiempo de compilación aparte de plantillas - 10.5 Notas posteriores
-
10.1 Motivación de
-
11. Expresiones de pliegue
- 11.1 Motivación de las expresiones de pliegue
- 11.2 Usar expresiones de pliegue
- 11.3 Notas posteriores
-
12. Tratar con literales de cadena como parámetros de plantilla
- 12.1 Usar cadenas en plantillas
- 12.2 Notas posteriores
-
13. Tipos de marcador de posición similares a
auto
usados como parámetros de plantilla-
13.1 Usar
auto
en parámetros de plantilla -
13.2 Usar
auto
como un parámetro de plantilla de variable -
13.3 Usar
decltype(auto)
como parámetro de plantilla - 13.4 Notas posteriores
-
13.1 Usar
-
14. Declaraciones
using
extendidas-
14.1 Usar declaraciones
using
variádicas -
14.2 Declaraciones
using
variádicas para constructores heredables - 14.3 Notas posteriores
-
14.1 Usar declaraciones
-
9. Deducción de argumentos de plantillas de clase
-
III Nuevos componentes de la biblioteca
-
15.
std::optional<>
-
15.1 Usar
std::optional<>
-
15.2 Tipos y operaciones de
std::optional<>
- 15.3 Casos especiales
- 15.4 Notas posteriores
-
15.1 Usar
-
16.
std::variant<>
-
16.1 Motivaci贸n de
std::variant<>
-
16.2 Usar
std::variant<>
-
16.3 Tipos y operaciones de
std::variant<>
-
16.4 Poliformismo y colecciones heterog茅neas con
std::variant
-
16.5 Casos especiales con
std::variant<>
- 16.6 Notas posteriores
-
16.1 Motivaci贸n de
-
17.
std::any
-
17.1 Usar
std::any
-
17.2 Tipos y operaciones de
std::any
- 17.3 Notas posteriores
-
17.1 Usar
-
18.
std::byte
-
18.1 Usar
std::byte
-
18.2 Tipos y operaciones de
std::byte
- 18.3 Notas posteriores
-
18.1 Usar
-
19. Vistas sobre cadenas (
std::string_view
s)-
19.1 Diferencias al comparar con
std::string
- 19.2 Usar vistas sobre cadenas
- 19.3 Usar vistas sobre cadenas como par谩metros
- 19.4 Tipos y operaciones de vistas sobre cadenas
- 19.5 Usar vistas sobre cadenas en una API
- 19.6 Notas posteriores
-
19.1 Diferencias al comparar con
-
20. La biblioteca del sistema de archivos
- 20.1 Ejemplos b谩sicos
- 20.2 Principios y terminolog铆a
- 20.3 Operaciones de las rutas de acceso
- 20.4 Operaciones del sistema de archivos
- 20.5 Iterar sobre directorios
- 20.6 Notas posteriores
-
15.
-
IV Extensiones y modificaciones a la biblioteca
-
21. Extensiones a los rasgos de tipo
-
21.1 Sufijo
_v
de los rasgos de tipo - 21.2 Nuevos rasgos de tipo
- 21.3 Notas posteriores
-
21.1 Sufijo
-
22. Algoritmos paralelos de la STL
- 22.1 Usar algoritmos paralelos
- 22.2 Políticas de ejecución
- 22.3 Control de excepciones
- 22.4 Beneficio de no usar algoritmos paralelos
- 22.5 Resumen de los algoritmos paralelos
- 22.6 Motivación de los nuevos algoritmos para procesamiento paralelo
- 22.7 Notas posteriores
-
23. Nuevos algoritmos de la STL en detalle
-
23.1
std::for_each_n()
- 23.2 Nuevos algoritmos numéricos de la STL
- 23.3 Notas posteriores
-
23.1
-
24. Subcadenas y buscadores de subsecuencias
- 24.1 Usar buscadores de subcadenas
- 24.2 Usar buscadores de subsecuencias generales
- 24.3 Usar predicados de buscadores
- 24.4 Notas posteriores
-
25. Otros algoritmos y funciones de utilidad
-
25.1
size()
,empty()
, ydata()
-
25.2
as_const()
-
25.3
clamp()
-
25.4
sample()
- 25.5 Notas posteriores
-
25.1
-
26. Extensiones a contenedores y cadenas
- 26.1 Controles de nodos
- 26.2 Mejoras a emplazamiento
- 26.3 Soporte de contenedores para tipos incompletos
- 26.4 Mejoras a cadenas
- 26.5 Notas posteriores
-
27. Multihilos y concurrencia
- 27.1 Cerrojos y mutexes suplementarios
-
27.2
is_always_lock_free
para tipos atómicos - 27.3 Tamaños de las líneas de caché
- 27.4 Notas posteriores
-
28. Otras características y pequeñas modificaciones a la biblioteca
-
28.1
std::uncaught_exceptions()
- 28.2 Mejoras a punteros compartidos
- 28.3 Extensiones numéricas
-
28.4 Extensiones a
chrono
-
28.5 Extensiones y correcciones a
constexpr
-
28.6 Extensiones y correcciones a
noexcept
- 28.7 Notas posteriores
-
28.1
-
21. Extensiones a los rasgos de tipo
-
V Utilidades para expertos
-
29. Recursos de memoria polifórmicos (PMR)
- 29.1 Usar recursos de memoria estándares
- 29.2 Definir recursos de memoria personalizados
- 29.3 Proveer soporte de recursos de memoria para tipos personalizados
- 29.4 Notas posteriores
-
30.
new
ydelete
con datos sobrealineados-
30.1 Usar
new
con alineaciones -
30.2 Implementar el operador
new()
para memoria alineada -
30.3 Implementar un operador
new()
global -
30.4 Rastrear todas las llamadas a
::new
- 30.5 Notas posteriores
-
30.1 Usar
-
31.
std::to_chars()
ystd::from_chars()
- 31.1 Motivación de conversiones de bajo nivel entre secuencias de caracteres y valores numéricos
- 31.2 Ejemplo de uso
- 31.3 Soporte de ida y vuelta para punto flotante
- 31.4 Notas posteriores
-
32.
std::launder()
-
32.1 Motivación de
std::launder()
-
32.2 Cómo
launder()
resuelve el problema -
32.3 Por qué/cuándo
launder()
no funciona - 32.4 Notas posteriores
-
32.1 Motivación de
-
33. Mejoras para implementar c贸digo gen茅rico
-
33.1
std::invoke<>()
-
33.2
std::bool_constant<>
-
33.3
std::void_t<>
- 33.4 Notas posteriores
-
33.1
-
29. Recursos de memoria polifórmicos (PMR)
-
VI Consejos generales finales
-
34. Ajustes comunes de C++17
-
34.1 Valor de
__cplusplus
- 34.2 Compatibilidad con C11
- 34.3 Tratar con controladores de señales
- 34.4 Garantías del avance progresivo
- 34.5 Notas posteriores
-
34.1 Valor de
-
35. Caracter铆sticas en desuso y eliminadas
- 35.1 Caracter铆sticas base del lenguaje en desuso y eliminadas
- 35.2 Caracter铆sticas de la biblioteca en desuso y eliminadas
- 35.3 Notas posteriores
-
Glossary
- A
- E
- I
- O
- P
- S
- T
- Index
-
34. Ajustes comunes de C++17
- Notas
Leanpub incondicional, sin riesgo, 100% de felicidad garantizada
Durante los primeros 60 días de compra, puedes obtener un reembolso del 100% de cualquier compra Leanpub, en dos clics. Procesamos las restituciones manualmente, así que puede tomarse unos días en aparecer. Véase términos completos.
Gana $8 en una compra de $10 y $16 en una compra de $20
Pagamos 80% de regalías en compras de $7.99 o más y 80% de regalías menos una tarifa fija de 50 centavos en compras entre $0.99 y $7.98. Ganas $8 en una venta de $10 y $16 en una venta de $20. Entonces, si vendemos 5000 copias no reembolsadas de tu libro por $20, ganarás $80,000.
(Sí, algunos autores ya han ganado mucho más que eso en Leanpub.)
De hecho, los autores han ganadomás de 13 millones de dólares escribiendo, publicando y vendiendo en Leanpub.
Obtén más información sobre escribir en Leanpub
Actualizaciones gratis. Libre de DRM.
¡Si compras un libro Leanpub obtienes actualizaciones gratis siempre y cuando el autor actualice el libro! Varios autores usan Leanpub para publicar sus libros en progreso mientras los escriben. Todos los lectores obtienen actualizaciones gratis, independientemente de cuándo compraron el libro o cuánto pagaron (incluyendo si fue gratis).
La mayoría de los libros Leanpub se encuentran disponibles en PDF (para computadores) y EPUB (para teléfonos, tabletas, y Kindle). Los formatos que un libro incluye se muestran en la esquina superior derecha de esta página.
Finalmente, los libros Leanpub no tienen ninguna de las cosas sin sentido sobre protección de copia DRM, así que puedes leerlos fácilmente en cualquier dispositivo que se soporta.
Aprende más sobre los formatos de Leanpub y dónde puedes leerlos