Tenho um projeto que usa C ++ 11/14, mas requer algo como std::filesystem
, que só está disponível em C ++ 17 e, portanto, não tenho a chance de usá-lo atualmente. Vejo, entretanto, que está disponível em meu compilador atual como std::experimental::filesystem
. É uma boa ideia usar recursos experimentais, presumindo que no futuro eu possa adicionar algo como:
#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif
Minhas preocupações são:
1. É garantido que todos os compiladores compatíveis tenham os mesmos recursos experimentais?
2. Os recursos experimentais estão sujeitos a grandes mudanças que os tornam não confiáveis?
Talvez haja mais coisas para se perguntar. Por que devo ou não usá-los? Estou intrigado com um novo projeto e não sei o que decidir.
c++
c++11
portability
c++17
c++-standard-library
The Quantum Physicist
fonte
fonte
#idef CXX17
. IMHO, a maneira portátil é colocar todo o código relacionado ao sistema de arquivos em uma única unidade de compilação (pode ser uma classe), usá-lo em todas as partes restantes do código, codificá-lo com o padrão C ++ 11/14 atual. Documente como e por que você o escreveu dessa forma e, eventualmente, transportá-lo para C ++ 17 mais tarde durante uma fase de manutenção, se fizer sentido. (comentando sobre a pergunta original)filesystem
você correr muito menos risco ao usá-lo do que outras coisas, como você já sabe que ele é padronizado em C ++ 17, e a especificação C ++ 17 exata dele está disponível publicamente. Portanto, tudo que você precisa fazer é certificar-se de usar apenas osexperimental::filesystem
recursos que estão na especificação C ++ 17. E, claro, você deve saber que todas as suas plataformas direcionadas suportam umexperimental::filesystem
ou o C ++ 17std::filesystem
.Respostas:
Não, os recursos experimentais são opcionais.
Sim, o comitê C ++ pode até decidir abandonar um recurso ou, no processo de padronização, pode surgir um defeito que forçaria a alteração de um recurso.
Geralmente, não é uma boa ideia depender de recursos experimentais. Os recursos experimentais são exatamente o que a palavra diz (ou seja, para experimentar).
fonte
Alguém da audiência fez uma pergunta durante a palestra "C ++ Standard Library Panel" na CppCon 2016 ( YouTube ) sobre o potencial do nome
experimental
para assustar os usuários e evitar que usem qualquer coisa dentro do namespace:Michael Wong (presidente do SG5 e SG14 e editor do Concurrency TS) respondeu à pergunta primeiro:
Alisdair Meredith (ex-presidente do LWG) então acompanhou:
Stephan T. Lavavej (mantenedor da implementação STL da Microsoft) foi o último a responder:
Portanto, parece que há algum desejo entre os desenvolvedores de biblioteca padrão e membros do comitê de que, pelo menos no futuro, o conteúdo do
std::experimental
namespace seja verdadeiramente "experimental" por natureza, e não deve ser dado como certo que algostd::experimental
será torná-lo no padrão C ++.E não, tanto quanto eu entendo, depende dos fornecedores de bibliotecas padrão se eles fornecem implementações para os vários recursos internos
std::experimental
.fonte
"Experimental" é um termo um pouco exagerado. A
filesystem
biblioteca teve origem no Boost e passou por algumas iterações lá, antes de ser submetida à ISO.No entanto, os padrões ISO são intencionalmente muito conservadores. Chamar de experimental significa que a ISO não promete explicitamente que a nomenclatura será estável; está bastante claro que você precisará endereçar novamente seu código em algum momento no futuro. Mas, conhecendo a ISO, é provável que haja orientação sobre como.
Quanto à compatibilidade entre compiladores, espere que seja razoável. Mas haverá casos extremos (pense nos caminhos relativos à unidade do Windows, por exemplo), e é exatamente por isso que um padrão futuro pode quebrar seu código existente. Idealmente, isso quebraria seu código se e somente se você dependesse desse caso, mas isso não é uma garantia.
fonte
Alguns pontos a considerar:
Quão multiplataforma é o seu projeto? Se houver apenas um compilador envolvido, você pode inspecionar sua implementação e histórico para decidir. Ou pergunte a eles!
Qual é o tamanho da sua base de código? Quão grande seria o impacto das mudanças?
Quão fundamentais para o seu projeto são os recursos fornecidos pela API / biblioteca / recurso?
Quais são as alternativas?
experimental::
ou tão difícil quanto forçar soluções alternativas.experimental
um falhar ou desaparecer.fonte