Ini adalah fitur eksperimental modern C++ yang dapat diandalkan untuk proyek-proyek jangka panjang?

Saya memiliki sebuah proyek yang saat ini menggunakan C++11/14, tetapi membutuhkan sesuatu seperti std::filesystem, yang hanya tersedia dalam C++17, dan karenanya saya don't memiliki kesempatan untuk saat menggunakannya. Saya melihat, bagaimanapun, bahwa itu's tersedia dalam saya saat ini compiler sebagai std::experimental::filesystem. Itu ide yang baik untuk menggunakan fitur eksperimental, dengan asumsi bahwa saya dapat di masa depan menambahkan sesuatu seperti:

#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif

Keprihatinan saya adalah:

1. Itu dijamin bahwa semua compliant penyusun yang sama-sama memiliki fitur eksperimental?

2. Ini adalah fitur eksperimental rentan terhadap perubahan besar yang membuat mereka tidak dapat diandalkan?

Mungkin ada's lebih banyak hal untuk bertanya-tanya tentang. Mengapa saya harus atau sebaiknya saya tidak menggunakannya? I'm bingung dengan sebuah proyek baru dan don't tahu apa yang harus memutuskan.

Mengomentari pertanyaan (16)
Larutan
  1. Itu dijamin bahwa semua compliant penyusun yang sama-sama memiliki fitur eksperimental?

Tidak, fitur eksperimental adalah opsional.

  1. Ini adalah fitur eksperimental rentan terhadap perubahan besar yang membuat mereka tidak dapat diandalkan?

Ya, C++ panitia bahkan mungkin memutuskan untuk meninggalkan fitur atau dalam proses standarisasi cacat mungkin akan muncul yang akan memaksa fitur untuk mengubah.

Umumnya, it's bukan ide yang baik untuk tergantung pada fitur eksperimental. Fitur eksperimental ini adalah persis apa kata firman (yaitu, untuk bereksperimen dengan).

Komentar (10)

Seseorang dari penonton mengajukan pertanyaan selama "C++ Standar Library Panel" berbicara di CppCon 2016 ([YouTube][1]) tentang potensi untuk nama percobaan untuk menakut-nakuti pengguna jauh dari menggunakan apa-apa di dalam namespace:

Apakah kalian menganggap [isi std::eksperimental namespace] siap produksi dan adalah bahwa argumen yang dapat dibuat, [yang] it's secara efektif produksi siap untuk 3 tahun ke depan, dan mungkin anda harus mengubah kode 3 tahun kemudian, mungkin?

Michael Wong (ketua SG5 dan SG14 dan editor dari Concurrency TS) menerjunkan pertanyaan pertama:

saya pikir ada's sangat konsensus di dalam komite yang praktis siap produksi. Seperti yang saya katakan sebelumnya, dalam kebanyakan kasus 99% itu mendapat udara turun dalam. Kami ingin memastikan bahwa itu's bukanlah halangan bagi anda untuk menggunakannya. Anda dapat memahami mengapa kita ingin menempatkan fitur besar, kelompok besar yang berkualitas, dalam konteks seperti itu, sehingga doesn't mengganggu istirahat dari seluruh sistem perpustakaan, tetapi juga membuat lebih mudah bagi anda untuk menggunakannya. Sekarang anda dapat mengaktifkan GCC dengan spesifik bendera untuk Konsep, kau tahu, itu benar-benar membuatnya lebih mudah bagi anda untuk segmen itu.

Alisdair Meredith (mantan ketua LWG) kemudian diikuti:

I'm akan mengambil bertentangan posisi di sini. Salah satu hal Ramuan [Sutter] dikatakan sebagai penyeimbang WG21, standar, ketika kami berangkat menyusuri jalan TSes, dia didn't berpikir bahwa TSes akan berhasil sampai kita telah gagal untuk membawa sesuatu ke depan, karena itu berarti kita're tidak sedang eksperimental cukup, kita're tidak cukup ambisius dalam apa yang kita're menggunakan TSes untuk. Kami benar-benar ingin bahwa percobaan untuk menjadi petunjuk bahwa, ya, hal-hal ini dapat berubah sewaktu-waktu, kita're tidak mengikat untuk hal itu, dan kita bisa mendapatkan hal-hal yang salah. Ini adalah untuk menurunkan penghalang kami untuk hal-hal yang kita anggap sebagai ambisius dan mencapai seperti yang bisa kita [...] Sekarang standar tampaknya pada tiga tahun siklus rilis, kita harus jauh lebih ambisius dalam menempatkan benar-benar fitur eksperimental ke TS, dan mungkin memajukan hal-hal lebih cepat menjadi standar utama itu sendiri. Tapi sekali lagi, ini akan menjadi menyenangkan topik untuk kita bicarakan di beberapa [C++ komite standar] pertemuan.

Stephan T. Lavavej (pengelola Microsoft's STL implementasi) adalah yang terakhir untuk menanggapi:

It's penting untuk menarik perbedaan antara experimentalness antarmuka dan experimentalness pelaksanaan, karena ketika anda mengatakan "siap produksi", apa artinya? Biasanya, "siap produksi", anda akan berpikir bahwa berbicara tentang pelaksanaannya. It's sangat mungkin untuk implementasi [sesuatu di std::eksperimental] harus benar-benar [...] antipeluru. [...] Sesuatu seperti [...] the <random> header di TR1, [itu] benar-benar, benar-benar bagus di TR1, dan anda bisa memiliki aplikasi yang benar-benar peluru-bukti pelaksanaan itu, tapi ternyata bahwa antarmuka bergejolak secara substansial [sebelum rilis] C++11 dan [...] jika kita tahu saat itu apa yang kita lakukan sekarang, menempatkan dalam sebuah percobaan akan menjadi sinyal yang lebih baik untuk orang-orang yang ", Hei, mungkin anda don't ingin menggunakan std::experimental::variate_generator karena, ha-ha, itu's akan menghilang dalam C++11".

Jadi sepertinya bahwa ada beberapa keinginan di antara standar perpustakaan pengembang dan anggota komite itu, di masa depan, setidaknya, isi std::eksperimental namespace harus benar-benar "eksperimental" di alam, dan ini tidak boleh diambil untuk diberikan bahwa ada sesuatu di std::eksperimental akan membuatnya menjadi standar C++.

Dan tidak, sejauh yang saya mengerti, itu adalah sampai dengan standar perpustakaan vendor, apakah mereka menyediakan implementasi untuk berbagai fitur dalam std::eksperimental.

Komentar (2)

"Eksperimental" adalah sedikit berlebihan jangka panjang. Sistem file perpustakaan berasal dari Dorongan dan pergi melalui beberapa iterasi yang ada, sebelum diserahkan ke ISO.

Namun, standar ISO sengaja very konservatif. Menyebutnya eksperimental berarti ISO secara eksplisit doesn't berjanji bahwa penamaan akan menjadi stabil; it's sangat jelas bahwa anda akan perlu untuk kembali alamat kode anda beberapa waktu di masa depan. Tapi mengetahui ISO, it's kemungkinan bahwa akan ada panduan bagaimana.

Untuk kompatibilitas antara compiler, berharap untuk menjadi yang wajar. Tapi akan ada kasus sudut (berpikir Jendela drive-jalur relatif, misalnya), dan yang's persis mengapa standar masa depan mungkin melanggar kode yang ada. Idealnya, itu akan memecahkan kode anda jika dan hanya jika anda bergantung pada sudut itu terjadi, tetapi itu's bukan jaminan.

Komentar (0)

Mungkin ada's lebih banyak hal untuk bertanya-tanya tentang.

Beberapa poin yang perlu dipertimbangkan:

  • Bagaimana multiplatform proyek anda? Jika hanya ada satu compiler yang terlibat, maka anda dapat memeriksa pelaksanaannya dan track record untuk memutuskan. Atau meminta mereka!

  • Seberapa besar anda codebase? Berapa besar dampak dari perubahan?

  • Bagaimana dasar untuk proyek anda adalah fitur yang disediakan oleh API/library/fitur?

  • Apa alternatifnya?

  • Gunakan fitur eksperimental, kemudian menyesuaikan kode untuk modifikasi ketika/jika itu menjadi standar. Mungkin semudah menghapus eksperimental::, atau sekeras memaksa workarounds.

  • Tambahkan lapisan abstraksi (Serge Ballesta komentar). Jika fitur eksperimental perubahan re-menulis yang terisolasi. Untuk fitur standar, itu mungkin berlebihan (std::filesystem sudah lapisan abstraksi...).

  • Menggunakan API/library. Pertanyaan yang sama: kedewasaan? kekokohan? stabilitas? portabilitas? kemudahan penggunaan? fitur?

  • Dalam kasus std::filesystem (atau jaringan TS), ada boost::filesystem (resp. meningkatkan::asio) sebagai alternatif atau mundur, dalam kasus eksperimental satu gagal atau desappears.

Komentar (0)