問題タブ [c++17]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
templates - 関数ポインタ関数によってテンプレート化されたテンプレートパラメータとしてラムダを渡す
関数ポインター関数によってテンプレート化されたテンプレートパラメーターとして、キャプチャーなしのラムダを渡すことができないようです。私はそれを間違った方法でやっていますか、それとも不可能ですか?
c++ - cv 参照修飾子をコピーするための型特性
C++でライブラリのようなコードを書くと、copy_cv_reference_t
型特性に特に必要があることがわかりました。
私は、型修飾子の id を使用する方法と SFINAE のみを使用する方法の 2 つの方法を使用して、自分でそれを発明しました。
最初のアプローチは少し人工的に見えますが、追加の側面として「型修飾子 ID」を提供し、後者は状況によっては便利です。2 番目のアプローチは、本質的に 2 段階のアプローチです。それには欠点があるかもしれません。さらにstd::remove_reference_t
、cv 修飾された型を明らかにする必要があります。
一方では、標準では実装が「組み込み」型の特性を持つことが許可されていることを知っています。一方、現在のC++標準には型特性はありません。
copy_cv_reference_t
型特性の最適な実装は何ですか? 上記の2つだけではありません。それを実装するためのより良いアプローチはありますか? 対応する提案はありますか?
ネーミングはどうする?IDの順番は?
c++ - コントラクトとは (C++17 で提案されているように)?
私はB. Stroustrup によるC++17 についての考え でコントラクトについて読み、それらについて話す小さなプレゼンテーションを支援しましたが、それらを本当に理解しているかどうかはわかりません。
だから私はいくつかの尋問があり、いくつかの例でそれらを説明することが可能であれば:
コントラクトはクラシックのより良い代替品であり、
assert()
一緒に使用する必要がありますか? ソフトウェア開発者にとって、実際に簡単な言葉で表される契約は何ですか?契約は、例外の処理方法に影響を与えますか? はいの場合、例外と契約をどのように使用する必要がありますか?
コントラクトを使用すると、実行時のオーバーヘッドが発生しますか? リリースコードでそれらを無効にすることはできますか?
提案 N4415から:
Vector クラスのインデックス演算子の事前条件コントラクトは、次のように記述できます。
T& operator[](size_t i) [[expects: i < size()]];
同様に、ArrayView クラスのコンストラクターの事後条件コントラクトは、次のように表現できます。
ArrayView(const vector<T>& v) [[ensures: data() == v.data()]];
@Keith Thompson のコメントに感謝します。
コントラクトは C++20 にはなりませんでした。新しい研究会SG21が発足しました。
c++ - boost::filesystem::canonical() がターゲット パスの存在を必要とするのはなぜですか?
状態のドキュメントboost::filesystem::canonical(const path& p)
:
概要: 存在しなければならない p を、シンボリック リンク、ドット、またはドット ドット要素を含まない絶対パスに変換します。
...
備考: !exists(p) はエラーです。
この結果、p がターゲットが存在しないシンボリック リンクを識別した場合、関数は失敗しfile not found
、パスを返しません。
リンクのターゲットが存在しないという理由だけで、関数がその存在しないターゲットのパスを解決できない理由がわかりません。(これに比べて、absolute()
はそのような制限を課していません。)
(明らかに、パス内のシンボリック リンクが壊れている場合、ターゲット パスは解決できません。)
では、この制限には正当な理由がありますか?
また、あるとしても、この制限を持たない関数のバリアントを作成することも正当化されませんか? (このようなバリアントがなければ、パスを取得するには、canonical()
既に行っていることの 99% を手動で複製する必要があり、エラーが発生しやすくなります。)
stat()
このケースの間に存在するセマンティックな機微が、lstat()
このケースにも等しく適用されることを理解しています。これがまさに、関数のバリアントが等しく正当化されると考える理由です。
注意: この質問は、に基づいているstd::experimental::filesystem
ライブラリ ( n4100boost::filesystem
) にも同様に当てはまります。
編集:
以下の@Jonathan Wakeleyの非常に知識豊富な回答の後、元の質問の本質が残っています。これを少し再構成します。
ターゲットの存在を必要とする根本的な技術的または論理的な理由はありますか?
boost::filesystem::canonical()
つまり、ターゲットが存在しないと、どういうわけか正規形への道を解決できなくなるのでしょうか?そうでない場合、ターゲットの存在を必要としないという点で既存の形式とのみ異なる機能のバリエーションを提案しない技術的または論理的な理由はありますか?
boost::filesystem
提案された N4100 への変換 (私が理解しているように)std::experimental::filesystem
では、この制限は十分なcanonical()
検討の後に採用されていますか、それとも Boost の定義から「抜け落ちている」だけですか?
編集2:
Boost 1.60が次の関数を提供するようになったことに気付きましたweakly_canonical()
。canonical()
もしあれば、存在しない p の要素によって。」
編集3:
これについては、に関連してさらに説明std::filesystem
します。
c++ - C++ で破壊をエミュレートするにはどうすればよいですか?
JavaScript ES6 には、 destructuringと呼ばれる言語機能があります。他の多くの言語にも存在します。
JavaScript ES6 では、次のようになります。
同様の構文を取得し、この種の機能をエミュレートするには、C++ で何ができますか?
c++ - int a=1、は || です。1 定数式?
N4527 5.20[expr.const]p5
定数式は、値が定数式 (以下で定義) の許可された結果であるエンティティを参照する glvalue コア定数式、または値がオブジェクトである prvalue コア定数式のいずれかです。 :
— 参照型の各非静的データ メンバーは、定数式の許可された結果であるエンティティを参照します。
— オブジェクトまたはサブオブジェクトがポインター型の場合、静的ストレージ期間を持つオブジェクトのアドレス、そのようなオブジェクトの末尾を過ぎたアドレス (5.7)、関数のアドレス、または null ポインター値が含まれます。
エンティティは、それが一時オブジェクトではないか、値が上記の制約を満たす一時オブジェクトである静的ストレージ期間を持つオブジェクトである場合、または関数である場合、定数式の許可された結果です。
a || 1
定数式ですか?
N4527 5.20[expr.const]p2
条件式 e は、抽象マシン (1.9) の規則に従って e を評価した場合に、次の式のいずれかが評価されない限り、コア定数式です。
(2.7) — 適用されない限り、左辺値から右辺値への変換 (4.1)
(2.7.1) — 定数式で初期化された、前に初期化された完全な不揮発性 const オブジェクトを参照する、整数型または列挙型の不揮発性 glvalue、または
(2.7.2) — 文字列リテラルのサブオブジェクトを参照する不揮発性の glvalue (2.13.5)、または
(2.7.3) — constexpr で定義された不揮発性オブジェクトを参照する、またはそのようなオブジェクトの可変でないサブオブジェクトを参照する、非揮発性の glvalue、または
(2.7.4) — 有効期間が e の評価内で始まる不揮発性オブジェクトを参照する、リテラル型の不揮発性 glvalue。
コア定数式ですかa || 1
?
c++ - Boost ライブラリを C++ に含めた後、古い標準コードでの使用以外に、Boost ライブラリはどうなりますか?
C++11、C++14 以降では、Boost ライブラリが実際の言語標準 (または標準の一部になる可能性が高い TS ドキュメント) に採用/組み込まれていることに気付きました。 : Boost.optional、Boost.Any、Boost のスレッド ライブラリ、スマート ポインタなど。
これらのライブラリは現在、古いバージョンの言語標準を使用する C++ コードで使用するためだけに維持されていますか、それとも追加の用途がありますか? 具体的には、それらのいくつかは、C++ 標準化団体の選択に対する代替のセマンティック バリアントと見なされますか?