問題タブ [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++ - メンバー関数の cv-ref-qualifier の転送
(メンバー) 関数 templateの別のオーバーロード (f(T &)
または など)がない場合、はいわゆる転送参照であり、cv 修飾型の、 またはのいずれかです。しかし、メンバー関数のcv-ref-qualifiersにはそのような規則はありません。has always 右辺値参照修飾子。f(volatile T &&)
template< typename T > f(T &&);
T &&
T
U
U &
U
struct S { void f() && { ; } };
S::f()
volatile
一般的なコードでは、すべてのメンバー関数が一般的に同じことを行う場合に、メンバー関数の 4 つ (または修飾子も考慮すると 8 つ) のオーバーロードの定義を避けることが非常に便利です。
この方法で発生するもう 1 つの問題は、特定の意味で有効なcv-ref-qualifierを定義することが不可能であるということです。次のコードでは、メンバー関数のref-qualifierがofである*this
かどうかを判断できません。operator ()
&&
&
しかし、上記の構文があれば、とてもいいでしょう。つまり、 のdecltype((*this))
正確なcv-ref 修飾型を示し*this
ます。私の考えでは、 C++標準の今後のバージョンにこのような構文を導入することは、重大な変更ではありません。しかし&&
、cv-ref-qualifier の転送は (そして、委員会 (つまり、コア言語ワーキング グループ) の省略のように見えます)。
メンバー関数cv-ref-qualifierとcv-ref-qualified型の両方*this
をその本体に示す別のシーケンスが可能です:auto &&
などdecltype(&&)
。
C++17で使用するために準備された、この問題に関する提案はありますか?
c++ - センチネルと終了イテレータの違いは何ですか?
Eric Niebler の範囲提案を読ん
でいるときに、終了イテレータの代わりにセンチネルという用語に出くわしました。
終了イテレータに対するセンチネルの利点を理解するのに苦労しています。
標準的なイテレータのペアではできない、sentintel がテーブルにもたらすことの明確な例を誰かが提供できますか?
「センチネルは、過去のイテレータの抽象化です。センチネルは、範囲の終わりを示すために使用できる通常の型です。センチネルと範囲を示すイテレータは、EqualityComparable である必要があります。センチネルは、イテレータ i はセンチネルと等しく、i はその要素を指します。」-- N4382
センチネルは、位置だけでなく、範囲の終わりを決定する関数として機能すると思いますか?
c++ - コンストラクターは条件付きで明示的にマークされています
更新: 条件付き明示が C++20 ドラフトに組み込まれました。cppreference の詳細
cppreference std::tuple コンストラクター ページには、次のような C++17 のメモがたくさんあります。
このコンストラクターは、少なくとも 1 つが false である
explicit
場合にのみ使用されます。std::is_convertible<const Ti&, Ti>::value
i
条件付きで明示的なコンストラクターをどのように作成できますか? 頭に浮かんだ最初の可能性はexplicit(true)
、しかしそれは合法的な構文ではありませんでした。
の試みenable_if
は失敗しました:
エラーで:
c++ - C++ 17 で std::function の operator() が変更されるのはなぜですか?
次のコードは、C++14 ではおそらく違法ですが、C++17 では合法です。
わざわざテストしないでください。一貫性のない結果が得られ、バグなのか意図的な動作なのかを判断するのが難しくなります。ただし、2 つのドラフト (N4140 と N4527、どちらも github.com/cplusplus/draft にあります) を比較すると、[func.wrap.func.inv] に 1 つの大きな違いがあります。パラグラフ 2:
戻り値: R が void の場合は何も、そうでない場合は INVOKE の戻り値 (f, std::forward(args)..., R)。
上記はドラフト間で削除されました。これは、ラムダの戻り値が黙って破棄されることを意味します。これは誤機能のようです。誰も理由を説明できますか?
c++ - 実験的な::ファイルシステム リンカ エラー
私は実際に gcc 6.0 内の開発の先頭で新しい c++1z 機能を使用しようとしています。
この小さな例を試してみると:
私は得た:
gcc バージョンはスナップショット linux-gnu_6-20151011 です
新しい c++1z 機能にリンクする方法のヒントはありますか?
c++ - 変換された値に基づいて最小要素を見つける
これが、コードレビューから私にもたらされたタスクです。特別な種類の比較述語に基づいて、セットから最小値を選択したいと考えています。このような:
ここでは、述語に基づいて最小要素を見つけます。この述語は、両方の値の削減float
を計算し、それらの float を比較します。うまく機能し、きれいに見えます。
問題が見えますか?はい、N
要素のセットは時間calcReduction()
と呼ばれますが、要素ごとに1回2N
だけ計算するだけで十分です。N
この問題を解決する 1 つの方法は、明示的な計算を記述することです。
N
正常に動作し、への呼び出ししかありませんcalcReduction()
。ただし、 の明示的な呼び出しと比較して、あまりにも冗長に見え、意図が明確ではありませんmin_element
。呼び出すmin_element
と、最小限の要素を見つけることができると簡単に推測できるからです。
私が今持っている唯一のアイデアはmin_element_with_reduction
、範囲と縮小関数を受け入れるような独自のアルゴリズムを作成することです。合理的に聞こえますが、すぐに使える解決策があるかどうか疑問に思います。
明確な意図といくつかの準備が整ったソリューションでこのタスクを解決する方法についてのアイデアはありますか? ブースト大歓迎です。C++17 と範囲は興味深いものです。
c++ - コンセプトの CRTP でテンプレート テンプレート パラメーターを使用する
concept
基本クラスからの継承をテストする を書きたいと思います。
私のクラスは、CRTP を使用して、クラスBase
によってパブリックに継承されます。Derived
このコードは正常に動作します:
テンプレートにしたい場合、問題が発生しましたDerived
。これは可能ですか?
明らかな問題T
は、concept
宣言に no がないことです。さらに、私は宣言できないと確信しています
concept
にはテンプレート パラメータが 1 つ必要なためです。
編集-セクション 8.3.5、p23のワーキング ペーパー P0121R0リスト。その結果、私が読むところはどこでも、1つのパラメーターしか取ることができず、時代遅れであるか、間違っているか、または注意を怠って読んでいました。編集を終了template<typename T, typename U> concept bool C3 = true;
concept
T
ここで必要な他のタイプにアクセスできますか? 別の方法はありますか(テンプレートD
のタイプがそのタイプの情報を運ぶように思えますが、タイプを特定する必要があるため、T
使用することもできません...)using T = typename D<T>::valueType;
T
D<T>
c++ - C++ にはフリー関数 `size(object)` がありますか?
ほとんどの人が a のサイズを見つける方法string
は、 を使用するだけでmy_string.size()
問題なく動作するようです。さて、私は最近、私が行ったクラスの課題を行いました...
それ以外の....
しかし驚いたことに、古いコンパイラを実行していると思われる私のインストラクターは、そのコード行を実行できませんでした。私のコンパイラでは両方の方法で機能しますが、その理由はよくわかりません。
完全なプログラム (両方に対して 4 を出力):
問題に対する私の解決策が私のマシンでは機能したが、私の教授では機能しなかった理由を誰かが明らかにすることができますか? また、現在VS2015を実行しています。