タグ付けされた質問 「c++-standard-library」

C ++プログラミング言語では、C ++標準ライブラリはクラスと関数のコレクションであり、コア言語で記述されている場合とされていない場合があり、C ++の一部です。

2
GCC9はstd :: variantの値のない状態を回避できますか?
私は最近、std::visitコンパイラ間の最適化の素晴らしい比較につながるRedditディスカッションをフォローしました。私は次のことに気づきました:https : //godbolt.org/z/D2Q5ED GCC9とClang9の両方(同じstdlibを共有していると思います)は、すべての型がいくつかの条件を満たす場合に、値のない例外をチェックしてスローするためのコードを生成しません。これはより優れたcodegenにつながるため、MSVC STLで問題を提起し、次のコードが提示されました。 template <class T> struct valueless_hack { struct tag {}; operator T() const { throw tag{}; } }; template<class First, class... Rest> void make_valueless(std::variant<First, Rest...>& v) { try { v.emplace<0>(valueless_hack<First>()); } catch(typename valueless_hack<First>::tag const&) {} } 主張によると、これによりすべてのバリアントが無価値になり、ドキュメントを読むと次のようになります。 まず、現在含まれている値(存在する場合)を破棄します。次にT_I、引数を使用してtypeの値を作成する場合と同様に、含まれている値を直接初期化します。std::forward<Args>(args)....例外がスローされた場合、*thisvalueless_by_exceptionになることがあります。 わからないこと:なぜ「かもしれない」と記載されているのですか?操作全体がスローされた場合、古い状態を維持することは合法ですか?これはGCCが行うことなので、 // For suitably-small, trivially copyable types we …

1
shift_right()はC ++ 20でどのように実装される予定ですか?
C ++ 20では、<algorithm>ヘッダは、2つの新しいアルゴリズムを獲得:shift_left()およびshift_right()。どちらもLegacyForwardIteratorを受け入れます。についてはshift_left()、「iから開始する順番で移動する」と明記されている​0。の場合shift_right()、「ForwardItLegacyBidirectionalIteratorの要件を満たしている場合、移動はi最初から降順で実行される」と指定されていますlast - first - n - 1。 私は実装するのにかなり簡単な方法を考えることができますshift_left(): template <typename ForwardIt> constexpr inline ForwardIt shift_left(ForwardIt first, ForwardIt last, typename std::iterator_traits<ForwardIt>::difference_type n) { if (n <= 0) return last; ForwardIt it = first; for (; n > 0; --n, ++it) { if (it == last) return first; } return …

1
std :: stringとCスタイルの文字列リテラルの比較
次のコードがあるとします。 #include <iostream> #include <string> #include <iomanip> using namespace std; // or std:: int main() { string s1{ "Apple" }; cout << boolalpha; cout << (s1 == "Apple") << endl; //true } 私の質問は次のとおりです。システムはどのようにこれら2つをチェックしますか?s1はオブジェクト"Apple"ですが、Cスタイルの文字列リテラルです。 私の知る限り、異なるデータ型を比較す​​ることはできません。ここで何が欠けていますか?

1
<algorithm>と<utility>の両方にstd :: moveがあるのはなぜですか
私std::moveがここに投稿するのを見るほとんどの場合、それは&lt;utility&gt;バージョンを参照しています。 std::moveで&lt;algorithm&gt;、実際には、その名前が示唆している何を移動し、一方std::moveでは、&lt;utility&gt;ちょうど基本的に最終的には左辺値にはxValueを移動するための前処理段階ではxValue、にその引数をキャストします。それでmove、それぞれの機能が異なるときに、これらの両方に名前を付けるのは、ちょっと混乱しませんか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.