web-dev-qa-db-ja.com

最新のC ++の実験的機能は、長期プロジェクトに対して信頼性がありますか?

現在C++ 11/14を使用しているプロジェクトがありますが、C++ 17でのみ利用可能なstd::filesystemのようなものが必要なので、現在使用する機会がありません。ただし、現在のコンパイラではstd::experimental::filesystemとして利用可能です。将来的に次のようなものを追加できると仮定して、実験的な機能を使用するのは良い考えですか?

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

私の懸念は:

1。すべての準拠コンパイラーに同じ実験的機能があることが保証されていますか?

2。実験的機能は、信頼性を損なう大きな変更の傾向がありますか?

疑問に思うことがもっとあるかもしれません。なぜ使用する必要があるのですか?私は新しいプロジェクトに戸惑っていて、何を決めるべきかわかりません。

82
  1. すべての準拠コンパイラーに同じ実験的機能があることが保証されていますか?

いいえ、実験的な機能はオプションです。

  1. 実験的な機能は、信頼性のない大きな変更を行う傾向がありますか?

はい、C++委員会は機能を放棄することを決定したり、標準化の過程で機能の変更を強制する欠陥が発生したりする場合があります。

一般に、実験的な機能に依存することはお勧めできません。実験的な機能とは、Wordがまさに言っていることです(つまり、実験する機能です)。

79
101010

CppCon 2016での「C++標準ライブラリパネル」トークで聴衆の誰かが質問をしました( YouTube )名前experimentalがユーザーを名前空間内で使用することを恐れさせる可能性について:

[std::experimental名前空間の内容]の本番準備ができていると考えていますか、それは議論の余地があるということです。[それは]これは今後3年間の実質的な本番準備であり、コードを変更する必要があるかもしれません3数年後、多分?

Michael Wong(SG5およびSG14の議長であり、Concurrency TSの編集者)が最初に質問を回答しました。

委員会には、実質的に生産準備が整っているという強いコンセンサスがあると思います。前にも言ったように、ほとんどの場合、99%が空中投下されます。それを使用する上で障害にならないようにしたいと思います。このようなコンテキストに大きな機能、機能の大きなグループを配置する理由を理解できます。これにより、ライブラリシステム全体の邪魔にならないようにするだけでなく、使いやすくします。これで、Conceptsの特定のフラグを使用してGCCを有効にできるようになりました。これにより、実際に簡単にセグメント化できます。

その後、Alisdair Meredith(元LWG議長)がフォローアップしました。

ここで反対の立場を取ります。ハーブ[サッター]がTS21の道を切り開いたとき、標準グループWG21の招集者として言ったことの1つは、何かを前に出すことができないまでTSが成功するとは思わなかったということです。つまり、私たちは十分に実験的ではなく、TSを使用する目的について十分に野心的ではありません。本当に、experimentalがヒントになることを望んでいます。はい、これらのことは変更される可能性があり、それに拘束されず、間違ったことをすることができます。これは、できる限り野心的で到達できると考えるものに対する障壁を下げるためです。[...]現在、標準は3年のリリースサイクルにあるようです。 TSに移行し、おそらくより迅速にメイン標準自体に移行します。しかし、これは次の数回の[C++標準委員会]会議で議論する楽しいトピックです。

Stephan T. Lavavej(MicrosoftのSTL実装の管理者)は最後に応答しました:

インターフェースの実験性と実装の実験性を区別することが重要です。「生産準備完了」と言うとき、それはどういう意味ですか?通常、「生産準備完了」で、実装について話していると思います。 [std::experimental]の実装が完全に防弾となる可能性があります[...]。 [...] [...] TR1の<random>ヘッダーのようなもの[本当に]本当にTR1で素敵で、完全に防弾の実装ができたかもしれませんが、インターフェースが[++のリリース前] C++ 11と[...]を大きく変えたのは、当時のことを知っていれば、experimentalを入力することは人々にとってより良いシグナルだったでしょう。 「ねえ、多分あなたはstd::experimental::variate_generatorを使いたくないでしょう。なぜなら、ははは、C++ 11では消えてしまうからです。」.

そのため、標準ライブラリの開発者と委員会のメンバーの間では、少なくとも将来、std::experimental名前空間の内容は本質的に「実験的」である必要があります。 std::experimentalの何かがC++標準になります。

そして、私が理解している限り、std::experimental内のさまざまな機能の実装を提供するかどうかは標準ライブラリベンダー次第です。

50
Joseph Thomson

「実験的」は少し誇張された用語です。 filesystemライブラリはBoostで作成され、ISOに提出される前に、そこで何度か反復されました。

ただし、ISO標準は意図的にvery控えめです。実験的とは、ISOが命名が安定することを明示的に約束しないことを意味します。将来コードを修正する必要があることは明らかです。しかし、ISOを知っていれば、どのようにガイダンスがあるのでしょう。

コンパイラ間の互換性に関しては、合理的であることを期待してください。しかし、コーナーケースがあります(たとえば、Windowsのドライブ相対パスを考えてください)。それがまさに、将来の標準が既存のコードを壊すかもしれない理由です。理想的には、そのコーナーケースに依存している場合にのみコードが壊れますが、それは保証ではありません。

28
MSalters

疑問に思うことがもっとあるかもしれません。

考慮すべきいくつかのポイント:

  • プロジェクトはどの程度マルチプラットフォームですか?コンパイラが1つしか含まれていない場合は、その実装を調べて、決定するための記録を残すことができます。または彼らに聞いてください!

  • コードベースの大きさは?変更の影響はどの程度ですか?

  • API /ライブラリ/機能によって提供される機能は、プロジェクトにとってどれほど基本的ですか?

  • 代替手段は何ですか?

    • 実験的な機能を使用し、標準化された場合/変更された場合にコードを修正に適合させます。 experimental::を削除するのと同じくらい簡単な場合もあれば、回避策を強制するのと同じくらい難しい場合もあります。
    • 抽象化レイヤーを追加します(Serge Ballestaコメント)。実験的な機能が変更された場合、再書き込みは分離されます。標準機能の場合、やり過ぎかもしれません(std :: filesystemはすでに抽象化レイヤーです...)。
    • 別のAPI /ライブラリを使用します。同じ質問:成熟度?堅牢性?安定?移植性?使いやすさ?特徴?
  • Std :: filesystem(またはネットワークTS)の場合、experimentalが失敗または消失した場合の代替またはフォールバックとしてboost :: filesystem(またはboost :: asio)があります。
8
Pablo H