Hace 6 años | Por ccguy a infoq.com
Publicado hace 6 años por ccguy a infoq.com

El mes pasado, el comité ISO C++ aprobó formalmente la nueva norma C++17, después de que el trabajo sobre la misma finalizara en abril de 2017. Hemos aprovechado la oportunidad para hablar con Herb Sutter, que ha estado involucrado durante muchos años en las actividades del comité ISO C++ y que en realidad es su organizador. P: ¿Cuáles son los principales aspectos destacados de este nuevo estándar? ¿Cuáles de las características de C++17 deberían entusiasmar a los desarrolladores?

Comentarios

Irundiel

#13 el diccionario ya ha sido absorbido (no he podido evitarlo, lo siento, yo tb me voy)

D

#14 omg, no me di cuenta. Maldito dedo salchicha... lol

D

#17 Yo no me meto en los requisitos. Me limito a reimplementar el código original en C++

D

Por lo que he visto por encima Las cambios más importantes son en la STD más que en él núcleo del luenguaje.

LeDYoM

Yo ya lo uso.
#1 https://stackoverflow.com/questions/38060436/what-are-the-new-features-in-c17
Visual Studio 2017.4 Lo implementa en buena parte, pero GCC también.

D

#26 ya he dicho que era una refactorización. Ahora abre un ticket sí quieres cambiar la.funcionalidad

H

Los conceps no entraron en c++17 verdad?

ccguy

#6 No. Pero están en el primer borrador de C++20.

H

#10 Espero que de C++20 no pase porque tiene muy buena pinta.

D

Llega Pxx 76: Entrevista con Jose Garcia.

L

Jodo, pues para mí esto está desparramando cosa fina, cada vez veo el código más abstracto y menos legible.

D

#28 creo que la cosa es todo lo contrario ... cada vez código más compacto, legible y mantenible...
solo por despreocuparte de la gestión de memoria etc ...vale la pena

D

#27 Nunca hagas eso. using namespace es el demonio. Para algo estan los namespace, para saber a cual pertenece cada clase y función.

a

#47 Te lo compro, era por la broma.. hecho de menos el c++ ya que últimamente solo me salen trabajos en páginas web.

mr_b

#35 Pues igual sí, disculpa.

mr_b

#24 Los genéricos (generics o templates en inglés) son una forma de generar código en tiempo de compilación. En C se hacía (y se hace) mediante macros. Si en C se define algo como:

#define MY_MACRO(x) call_to_my_special_function(x, x+1)

todas las apariciones de MY_MACRO son resueltas por el preprocesador de C sustituyendo dicho valor por su contenido (call_to…). El problema de esto es que el compilador no tiene ni idea del símbolo MY_MACRO, ya que es resuelto por el preprocesador antes de que el compilador entre en juego. Esto conlleva ciertos problemas, como la ocultación de ciertos errores y el reporte de los mismos (se vuelve muy críptico).

Para solucionarlo se inventaron los generics, que no son más que una forma que tiene el compilador de generar código en tiempo de compilación, no de ejecución, al contrario de como dice #24. Por ejemplo, si haces una función tipo:

template
T process_value(T value)


cuando instancias dicha plantilla de la forma:

auto value = process_value(42);

Lo que hace el compilador es generar este código:

int process_value(int value)

y compilarlo. Lo bueno que tiene esto es que sí es el compilador el que genera el código, por lo que siempre sabe qué ha pasado en caso de error. No se encuentra con cosas raras generadas previamente. Con esto se consigue que se detecten antes y mejor los errores y, sobre todo, que se le reporten a los programadores de una forma más clara (aunque también te digo que si se usan las templates de la STL te puedes volver loco con los errores, sobre todo en compiladores anteriores a C++11).

D

#32 creo que me has citado mal, tanto en el número como en lo que dices que he dicho.

mr_b

Me resulta especialmente curioso cómo el todopoderoso C++ lleva ya unos cuantos años absorbiendo características de D y haciéndolas pasar como propias sin apenas dar crédito.

Por ejemplo, lo que en C++ llaman concepts, en D llevan años usando con el nombre de restricciones ( constraints). Y no son otra cosa que limitar las posibles instanciaciones de las plantillas (por ejemplo, que una plantilla sólo se pueda instanciar con un tipo de dato).

Lo mismo pasa con la deducción de parámetros devueltos (el famoso auto como tipo de dato al declarar variables) y de tipos de datos en plantillas (de lo que habla Sutter en la primera pregunta). O el foreach para arrays/ rangos (en C++ sigue siendo un for, pero con otra sintaxis entre los paréntesis).

Y llegamos al futuro C++20: van a meter los conceptos (ya lo tiene D), la concurrencia (también lo tiene D), los rangos (pues también lo tiene D), corrutinas (también).

También os digo que Herb Sutter ha colaborado en el desarrollo de D, por lo que tampoco me extraña mucho que todas las cosas buenas que tiene D las metan en un lenguaje que tiene mucha más aceptación y está mucho más extendido.

Yo, como fan de D, prefiero D (evidentemente) aunque tenga muchísima menos aceptación. Es un lenguaje que, aunque es complejo, no llega, ni de lejos, a la complejidad que tiene C++ y sí llega (e incluso supera) a la potencia de este.

D

#c-34" class="content-link" style="color: rgb(227, 86, 20)" data-toggle="popover" data-popover-type="comment" data-popover-url="/tooltip/comment/2848846/order/34">#34 Todo eso puede estar en D pero también en C#. Ignoro quien es pionero en qué, simplemente en C++ son mucho más conservadores a la hora de implementar nuevas funciones (y está Boost para testear muchas de ellas).

D

#36 si ...casi parece que sea boost el que suministre las nuevas funciones a C++

D

#41 negativo sin querer...

D

#34 no creo que sea así ...se adapta a los tiempos e implementa nuevas funciones de todos los lenguajes

cosmonauta

#30 Al resolverse en tiempo de ejecución son lentos y pueden dar fallos en runtme.

Por eso, en Go, son tan reacios a incluirlos. Uno de los objetivos de Go es generar código de calidad.

ktzar

Me sigue alucinando lo fresco que se siente Golang siendo un lenguaje tan sumamente sencillo. Cada vez que veo las "nuevas características" en Python, Ruby, Javascript, o C++ se me pone la piel de gallina.

RubiaDereBote

#9 Golang es una basura, no tiene genéricos.

llorencs

#16 Pregunta ignorante: ¿Qué son genéricos?

D

#24 son una especie de templates que tienen c#y java. Permiten por ejemplo crear una List una vez y luego la instancias con List o List List.
A diferencia de los templates de c++, los generics no sé resuelven en tiempo de compilación, por lo que no son exactamente lo mismo y hay cosas que se pueden hacer con unos y no con los otros.

Davilinho

#24 Es una forma abstracta de declarar un tipo. Un genérico puede adoptar cualquier forma.

class MyClass

Si instancias MyClass, la variable T puede adoptar cualquier forma (Int, String, Bool, o incluso un objeto custom)

squanchy

Profesionalmente, sólo he programado en ANSI C++ dos veces en toda mi vida, una vez para hacer un CGI en un servidor, y otra para implementar un plugin NPAPI. Todo lo demás han sido lenguajes visuales o javascript.

albandy

#c-2" class="content-link" style="color: rgb(227, 86, 20)" data-toggle="popover" data-popover-type="comment" data-popover-url="/tooltip/comment/2848846/order/2">#2 No he tocado el C++ desde que acabe la carrera.
Trabajando he tocado C, PHP, JS, Java y C# pero C++ no he tenido la ocasión.

squanchy

#4 Yo he trabajado varios años con Visual C++, pero con las MFCs, no tiene nada que ver con el C++ estándar.

D

#8 pero nada de nada...
cuando veo código VIsual C++ MFC ...flipo en colores... es chino mandarin.

Modern C++ es otra cosa muy distinta (y mucho mejor, claro)

D

Coincido en que las mejoras que mas se notan y se usan en el dia a dia son las que ayudan a escribir un codigo mas sencillo y menos propenso a errores (ranged for loops, auto, lambdas, constructores en miembros de clase...).
Si por ahi va a ir evolucionando el lenguaje, bienvenido sea (por ejemplo lo de poder declarar variables dentro de un switch)

D

#44 gcc 4.6 ???
¿pero que es?¿para una placa ARM?

con 4.8 puedes habilitar el soporte C++11 con -std=gnu++11 y probar...
https://gcc.gnu.org/gcc-4.8/cxx0x_status.html

j

He aquí un resumen de novedades que está bastante bien -> https://www.viva64.com/en/b/0533/#ID0EXCAC

H

En mi curro aún se usa C++98 . El dia que pueda usar C++17 creo que ya estaré cerca de la jubilación .

D

#20 Bueno, C++98 es más que C++17

D

#20 Me pareces excesivamente optimista, quizás en después de 2 o 3 reencarnaciones puedas usarlo. lol

D

#20 ¿que compilador usas?
porque yo ya voy a saco con los proyectos viejos que mantengo y meto todo en C++11 ...más que nada, por joder...
hay gente que ve un "auto i;" y flipa en colores

H

#39 Si por mi fuera usaría gcc-7 o clang-6 pero el código tiene que poder compilarse en versiones antiguas como gcc-4.8 como mínimo y no se si también gcc-4.6...

La verdad es que C++ plus STL está creciendo tanto que ponerse al día es bastante complicado (comparado con C por ejemplo).

C

#include
void main() ">

Observer

#12 #11 No estaría de mas añadir el cambio de linea, ademas de comenzar con mayúscula y el punto final.

También falta el return en ese código c.

mgm2pi

#12 te falta el std::endl

a

#12 Que frikada de conversación jajja.. bueeno vale me apunto.. mejor: using namespace std; así solo tienes que poner cout

D

#11 wtf has usado C