問題タブ [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.
c++ - 関数の自動パラメータ タイプ
auto
標準委員会が C++14キーワードを拡張して関数テンプレート パラメーターの型を推測することを検討したかどうかを知りたいです。(この回答にうまく描かれていることがわかるように)
ラムダ関数で機能するため、どの関数でも機能するはずです。もちろん、古典的な構文では完全に冗長になります。
しかし、同じ結果のために、これを書くことができます:
コードの詰まりが少なくなり (より短くきれいに)、このユース ケースでは一貫性が保たれると思います。
ご覧のとおり、 auto 型推定器を使用して を宣言しましv
たが、ハード型指定されたパラメーター化された関数 f またはテンプレート化された f のいずれかを使用する必要があります。
と組み合わせてauto
使用する必要auto
があります。これはより一貫性があります。
編集:この質問は確かに事実上同じことを尋ねますが、直接的ではありません。そして、user657267が与える答えをまだ得ていません。これを再現して拡張します。
c++ - 生の文字列リテラルの区切り文字が 16 文字未満でなければならないのはなぜですか?
次のプログラムはコンパイルされません。
エラー: raw string delimiter longer than 16 characters
。
生の文字列区切り文字に長さの制限があるのはなぜですか?
c++ - observer_ptrの使用
std::observer_ptr
ライブラリ基本技術仕様 V2の構造のポイントは正確には何ですか?
T*
動的メモリの安全性を追加しない場合、これは余分なステップのように思えます。
すべてのコードstd::unique_ptr
で、オブジェクトの明示的な所有権を取得する必要がある場所と、オブジェクトのstd::shared_ptr
所有権を共有できる場所を使用しています。
これは非常にうまく機能し、すでに破棄されたオブジェクトの偶発的な逆参照を防ぎます。
std::observer_ptr
もちろん、観測されたオブジェクトの寿命については保証しません。
std::unique_ptr
またはから構築されたstd::shared_ptr
場合、そのような構造での使用が見られますが、単純に使用しているコードT*
はおそらくそのまま使用し続け、何かに移行する予定がある場合は、std::shared_ptr
および/またはstd::unique_ptr
(使用中)。
簡単な関数の例を考えると:
監視中にスマート ポインターが格納されたオブジェクトを破棄するのを停止すると便利です。
しかし、私が観察したい場合、std::shared_ptr
またはstd::unique_ptr
私は書く必要があります:
これは、以下よりも安全ではありません。
では、この新しい構造の用途は何ですか?
自己文書化ソースのためだけですか?
c++ - スコープガードの言語サポート
スコープ ガードは非常にC++的なイディオムです。例外との相互作用が良好で、RAII に準拠しています。C++には、スコープ ガードのネイティブ サポートはありません。つまり、きれいな構文です。現時点では、ヘルパー クラスしか記述できません。c-tor はラムダをデータ メンバーとして格納し、d-tor はラムダを呼び出します (スコープの終了時または例外スロー時)。
現在、 C++でのスコープ ガードの便利な構文の提案はありますか?
またはのようなものを意味します (デフォルトint * i = new int; ~[&i] { if (i) { delete i; i = nullptr; } }; ...
でキャプチャを参照~{ /* statments */; }
として) 。lambda-syntax が with のシンタックス シュガーにすぎstruct
ないoperator ()
場合、 anonymous の「インライン」デストラクタには lambda-similar-syntax が存在する可能性がありますstruct
。
c++ - C++17 用に提案された UTF-8 文字リテラルのポイントは何ですか?
N4267によって提案されたこれらのポイントは正確には何ですか?
それらの唯一の機能は、拡張 ASCII 文字または部分的な UTF-8 コード ポイントが指定されないようにすることのようです。それらは依然として固定幅の8ビット文字で保存されます(私が理解しているように、これはほとんどすべてのユースケースでとにかくUTF-8を処理するための正しい最良の方法です)。全て。何が起こっている?
(実際には、UTF-8 文字列リテラルの必要性を理解しているかどうかも完全にはわかりません。Unicode の検証と組み合わせた Unicode 文字列で奇妙な/あいまいなことを行うコンパイラの心配だと思いますか?)
c++ - Clang とバイナリ フォールド式 — 空のパラメーター パックの呪い
具体的には、現在 Coliru によってホストされている Clang 3.6.0 です。
これらのスニペットはすべて次から呼び出されます。
次のコード:
次のコンパイル エラーが発生します。
だから私は式の周りに括弧を入れてみました:
動作しますが、警告が表示されます:
そこで、関数スタイルのキャストを使用して式の値を破棄しようとしましたvoid
:
しかし :
私も試してみましたstatic_cast
が、同じ結果でした。
だから私は代わりにCキャストで試しました:
しかしその後 :
...そして私の出力は----
次のとおりfoo(1, 2, 3);
です。もう出力されません!
Clang は将来の標準からの邪悪な力によって呪われているのでしょうか、バグがあるのでしょうか、それとも問題は私の椅子に座っているのでしょうか?
c++ - void_t を使用して複数の継承型の繰り返しエラーを検出する
渡された可変個引数型リストに重複する型がないかどうかhas_no_duplicates<...>
を評価する型特性を実装したいと考えています。std::true_type
この質問の範囲では、多重継承を使用してそれを行いたいと仮定しましょう。
クラスが同じ型を複数回継承すると、エラーが発生します。
void_t
このエラーを「検出」するために使用できたと思いましたが、 cppreference のコード サンプルに従って実際の解決策を実装できませんでした。
これは私が試したものです:
3 回目の試行では、 のようにテンプレート テンプレート パラメータとして取り、内部で展開dup_helper<...>
するラッパー クラスを使用して展開を遅らせてみました。dup_helper
wrapper<dup_helper, ...>
void_t
残念ながら、すべての試行で前述のエラーが発生し、常にコンパイルが妨げられました。
この種のエラーは「置換失敗」として検出できないと思いますが、確認をお願いします。
この種のエラーは実際に使用して検出することは不可能void_t
ですか? (常にコンパイルに失敗しますか?)
コンパイルを失敗させずにそれを検出する方法はありますか? (または、void_t
「多重継承のトリック」を引き続き利用する非回避策)?
c++ - Rust の結果に相当する C++タイプ?
私は自分の C++ コードで std::experimental::optional を使用するのが好きですが、問題は value_or であり、デフォルト値がオプションの値と同じ型である必要があります。
int を含むか、エラー メッセージを含むオプションが必要な場合、これはうまく機能しません。
値が存在するかエラーであるかを示すブール値を持つ共用体構造体を使用できると思いますが、C++ にResult<T, E>
Rust のような型があればいいのにと思います。
そのようなタイプはありますか?Boost がそれを実装していないのはなぜですか?
Result は Option よりもはるかに有用であり、Boost の人々は確かにその存在を認識しています。Rust の実装を読んで、それを C++ にコピーしてみませんか?
元:
c++ - Concepts TS に定義済みの概念はありますか?
「Concepts lite」はすでに TS として受け入れられており、(実装例) GCC のメイン ブランチにマージされています。Sortable
Random_access_range
そのような事前定義された概念はどこで探せばよいでしょうか?
cppreference.comのリストは正確で網羅的なリストですか?
最新の GCC トランク ビルドで使用できますか?
編集 1 : 概念が C++17 に受け入れられないため、C++17 を TS に変更しました。