Tengo un proyecto que actualmente usa C ++ 11/14, pero requiere algo como std::filesystem
, que solo está disponible en C ++ 17 y, por lo tanto, no tengo la oportunidad de usarlo actualmente. Sin embargo, veo que está disponible en mi compilador actual como std::experimental::filesystem
. ¿Es una buena idea usar funciones experimentales, asumiendo que en el futuro podría agregar algo como:
#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif
Mis preocupaciones son:
1. ¿Está garantizado que todos los compiladores compatibles tengan las mismas características experimentales?
2. ¿Son las funciones experimentales propensas a grandes cambios que las hacen poco fiables?
Quizás haya más cosas sobre las que preguntarse. ¿Por qué debería o no debería utilizarlos? Estoy desconcertado con un nuevo proyecto y no sé qué decidir.
fuente
#idef CXX17
. En mi humilde opinión, la forma portátil es poner todo el código relacionado con el sistema de archivos en una sola unidad de compilación (puede ser una clase), usarlo en las partes restantes del código, codificarlo con el estándar actual C ++ 11/14. Documente cómo y por qué lo escribe así y eventualmente lo transfiera a C ++ 17 más tarde durante una fase de mantenimiento, si tiene sentido. (comentando la pregunta original)filesystem
que incurra en un riesgo mucho menor al usarlo que otras cosas, ya que ya sabe que se estandariza en C ++ 17, y la especificación exacta de C ++ 17 está disponible públicamente. Entonces, todo lo que tiene que hacer es asegurarse de usar solo lasexperimental::filesystem
características que están en la especificación C ++ 17. Y, por supuesto, debe saber que todas sus plataformas específicas son compatibles con uno deexperimental::filesystem
C ++ 17std::filesystem
.Respuestas:
No, las funciones experimentales son opcionales.
Sí, el comité de C ++ podría incluso decidir abandonar una característica o en el proceso de estandarización podría surgir un defecto que obligaría a cambiar una característica.
Generalmente, no es una buena idea depender de funciones experimentales. Las características experimentales son exactamente lo que dice la palabra (es decir, para experimentar).
fuente
Alguien de la audiencia hizo una pregunta durante la charla del "Panel de biblioteca estándar de C ++" en CppCon 2016 ( YouTube ) sobre el potencial del nombre
experimental
para asustar a los usuarios de usar cualquier cosa dentro del espacio de nombres:Michael Wong (presidente de SG5 y SG14 y editor de Concurrency TS) respondió la pregunta primero:
Alisdair Meredith (ex presidente del LWG) luego hizo un seguimiento:
Stephan T. Lavavej (responsable de la implementación de STL de Microsoft) fue el último en responder:
Así que parece que hay algún deseo entre los desarrolladores de bibliotecas estándar y los miembros del comité que, en el futuro, al menos, el contenido del
std::experimental
espacio de nombres deben ser verdaderamente "experimental" en la naturaleza, y no debe darse por sentado que algo enstd::experimental
la voluntad conviértalo en el estándar C ++.Y no, por lo que tengo entendido, depende de los proveedores de bibliotecas estándar si proporcionan implementaciones para las diversas funciones que contiene
std::experimental
.fuente
"Experimental" es un término un poco exagerado. La
filesystem
biblioteca se originó en Boost y pasó por algunas iteraciones allí, antes de ser enviada a ISO.Sin embargo, las normas ISO son intencionadamente muy conservadoras. Llamarlo experimental significa que ISO explícitamente no promete que el nombre será estable; está muy claro que necesitará volver a direccionar su código en algún momento en el futuro. Pero conociendo ISO, es probable que haya orientación sobre cómo hacerlo.
En cuanto a la compatibilidad entre compiladores, espere que sea razonable. Pero habrá casos de esquina (piense en las rutas relativas a la unidad de Windows, por ejemplo), y esa es exactamente la razón por la que un estándar futuro podría romper su código existente. Idealmente, rompería su código si y solo si dependiera de ese caso de esquina, pero eso no es una garantía.
fuente
Algunos puntos a considerar:
¿Qué tan multiplataforma es tu proyecto? Si solo hay un compilador involucrado, puede inspeccionar su implementación y su historial para tomar una decisión. ¡O pregúntales!
¿Qué tamaño tiene su base de código? ¿Qué tan grande sería el impacto de los cambios?
¿Qué tan fundamentales para su proyecto son las características proporcionadas por la API / biblioteca / característica?
Cuales son las alternativas?
experimental::
o tan difícil como forzar soluciones alternativas.experimental
uno falle o desaparezca.fuente