タグ付けされた質問 「c++17」

C ++ 17は、2017年に承認されたC ++標準の名前です。これは、以前のC ++ 14標準に基づいて構築されており、コア言語と標準ライブラリを改善し、いくつかの新しい言語機能を追加しています。

1
参照による `constexpr`メンバー関数の呼び出し-clang vs gcc
次の例を考えてみます(スニペット(0)): struct X { constexpr int get() const { return 0; } }; void foo(const X& x) { constexpr int i = x.get(); } int main() { foo(X{}); } 上記の例は、g++以前のすべてのバージョンでコンパイルされg++ 10.x、でコンパイルされることはありませんclang++。エラーメッセージは次のとおりです。 error: 'x' is not a constant expression 8 | constexpr int i = x.get(); | godbolt.orgの実例 ただしx、の本体で定数式が使用されることはないため、エラーの種類には意味がありますfoo。 X::get()マークされてconstexprおり、の状態には依存しませんx。 に変更const …

1
std :: reduceとstd :: accumulateのどちらを選択するのですか?
std::accumulateそして、std::reduceほぼ同じことを行います。 の要約std::reduceはそれをすべて言います: similar to `std::accumulate`, except out of order 多くの場合、これらの関数は同じ最終結果をもたらし、同じ全体的な機能を発揮します。非常に重い負荷計算などを行っている場合はstd::reduce、並列化を試すことができます。つまり。ここで鳥の観点から見た従来の知恵は何ですか?明示的に最適化しない限り、常に鈍いstd :: accumulateに固執する必要がありますか?またはデフォルトで使用する必要がありますstd::reduceか? 場合はstd::reduce、少なくとも速さとして常にある(選択されたデフォルト/なし実行ポリシーを持つ)std::accumulate(少数の命令保存)、私は順序が厳しいときに累積にのみ使用されるべきだと思います。


3
現在のテンプレートをテンプレートパラメータの1つに対するテンプレートパラメータとして使用する
一般的なグラフ構造を作成しようとしていますが、頂点とエッジの間の循環依存関係に遭遇しています。私はVertexクラスとEdgeクラスを次のように定義します。 template<typename EdgeType> struct Vertex { std::vector<EdgeType> successors; }; template<typename EdgeCostType, typename VertexWrapper> struct Edge { EdgeCostType cost; VertexWrapper source; VertexWrapper dest; }; のようなものでインスタンス化したいのですがVertex<Edge<int, std::shared_ptr<decltype(v)>>> v;、明らかにできません。この循環依存関係を解決するにはどうすればよいですか? 編集: この問題の要約は、現在のテンプレートを現在のテンプレートのテンプレートパラメータの1つに対するテンプレートパラメータとして使用することです。 template<typename VertexWrapper> struct Vertex { std::vector<pair<int, VertexWrapper<Vertex>>> successors; };

3
値またはコールバック関数の割り当て時のC ++オーバーロードテンプレート
次のようなことをしようとしています... template <class T> struct Wrapper { template <class U> void set(const U& u) { myT = u; } template <class F> void set(F f) { myT = f(); } T myT; }; ここでSFINAEを使用する必要があることはわかっていますが、コールバックパラメーターと値パラメーターをどのように区別しますか?値をコールバックとして使用できないと想定しても安全です。 私が試したenable_ifとis_function, result_of、invoke_result、is_invocable、など、それのどれも右に動作しません。可能ですか?
8 c++  templates  c++17 

1
(一部の)アイテムを1つのstd :: mapから別のstd :: mapに効率的に移動する方法は?
2つのstd::map<>オブジェクトがaありb、いくつかの述語に基づいて、1つのマップから別のマップにいくつかの要素(ノード)を移動(extract+ insert)したいと思いpます。 for (auto i = a.begin(); i != a.end(); ++i) if (p(*i)) b.insert(a.extract(i)) このコードはclangでsegfaultします。問題は、iノードがaから抽出された後のの増加であると思います。 ポストインクリメントを使用してこれを修正する正しい/唯一の方法はありますか?例: for (auto i = a.begin(); i != a.end();) if (p(*i)) b.insert(a.extract(i++)) else ++i; 編集:現在の設定ではこれを再現できないため、「gccで動作する理由」に関する部分を削除しました。ある時点でそれが以前は使用されていたと確信していますが、gcc 9.2.1では(segfaultの代わりに)デッドロックが発生します。いずれにしても、後の増分extract()は機能しません。
8 c++  stl  c++17  stdmap 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.