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

C ++は汎用プログラミング言語です。もともとCの拡張として設計され、構文は似ていますが、現在は完全に異なる言語になっています。このタグは、C ++コンパイラでコンパイルされる(される)コードに関する質問に使用します。特定の標準リビジョン[C ++ 11]、[C ++ 14]、[C ++ 17]または[C ++ 20]などに関連する質問には、バージョン固有のタグを使用します。

2
なぜ `std :: string :: find()`は失敗時に終了イテレータを返さないのですか?
の動作がstd::string::find標準のC ++コンテナと一致しないことがわかりました。 例えば std::map<int, int> myMap = {{1, 2}}; auto it = myMap.find(10); // it == myMap.end() しかし、ひもについては、 std::string myStr = "hello"; auto it = myStr.find('!'); // it == std::string::npos 代わりに失敗したmyStr.find('!')リターンをすべきではないmyStr.end()のstd::string::nposですか? std::stringは他のコンテナと比較するとやや特殊なので、これには何らかの理由があるのか​​と思います。(驚いたことに、私はこれをどこかで疑う人を見つけることができませんでした)。

2
std :: hashが確定的であることが保証されていないのはなぜですか?
以降、N4140(C ++ 14 Standard)を使用します。 §17.6.3.4ハッシュ要件によると、 返される値k は、プログラム期間中の引数にのみ依存します。 [注:したがってh(k)、の同じ値を持つ 式のすべての評価は、プログラムの特定の実行に対してk同じ結果になります。—エンドノート] および§20.9.12クラステンプレートハッシュは言う ... インスタンス化hash<Key>は: (1.1)—ハッシュ要件を満たす(17.6.3.4)... (1.2)— ... これは、プログラムを再起動した場合value(つまりhash<decltype(value)>(value))のハッシュ値が別の値になる場合があることを意味します。 しかし、なぜ?この制限は、C ++ 11の標準ではなく、C ++ 14、C ++ 17、およびC ++ 20の標準にありました。ユーザー(STL開発者ではない)として、std::hash決定論的である場合は非常に便利です。確定的ハッシュ関数の実装に数学的な困難はありますか?しかし、私たちが日常的に使用しているハッシュ関数(たとえば、非推奨md5sumまたはより安全sha256)はすべて確定的です。効率の問題はありますか?

1
C ++コンパイル時間カウンター、再訪
TL; DR この投稿全体を読む前に、次のことを知っておいてください。 提示された問題の解決策は自分で見つけましたが、分析が正しいかどうかを知りたいと思っています。 fameta::counter残りのいくつかの癖を解決するクラスにソリューションをパッケージ化しました。githubで見つけることができます。 godboltの作業でそれを見ることができます。 すべての始まり FilipRoséenが発見/発明して以来、2015年に、時間カウンターをコンパイルするブラックマジックはC ++にあるため、デバイスにややこだわっていたため、CWG が機能を実行する必要があると判断したときはがっかりしましたが、彼らの心はいくつかの説得力のある使用例を示すことで変更できます。 次に、数年前、私はそのことをもう一度確認することにしました。これにより、uberswitch esを入れ子にできるようになりました-私の意見では興味深いユースケースです- の新しいバージョンではもはや機能しないことを発見しただけです。問題2118がオープン状態であっても(現在も)利用可能なコンパイラー:コードはコンパイルされますが、カウンターは増加しません。 この問題は、RoséenのWebサイト、および最近ではstackoverflowでも報告されています。C++はコンパイル時カウンターをサポートしていますか? 数日前、もう一度問題に取り組み、取り組むことを決めました コンパイラーの何が変わったのかを理解したかったのです。そのために、私は誰かがそれについて話してくれるようにインターウェブをずっと遠くまで検索しましたが、役に立ちませんでした。だから私は実験を始め、いくつかの結論に達しました。私はここで提示しているのですが、ここでは自分よりも知識のある人からフィードバックを得たいと思っています。 以下では、わかりやすくするために、Roséenの元のコードを示します。それがどのように機能するかの説明については、彼のウェブサイトを参照してください: template<int N> struct flag { friend constexpr int adl_flag (flag<N>); }; template<int N> struct writer { friend constexpr int adl_flag (flag<N>) { return N; } static constexpr int value = N; }; template<int …

1
クラスが独自のプライベート静的constexprメソッドにアクセスできない-Clangバグ?
このコードはClang(6、7、8、9、trunk)ではコンパイルされませんが、GCC(7.1、8.1、9.1)では問題なくコンパイルされます。 template<class T> struct TypeHolder { using type = T; }; template<int i> class Outer { private: template<class T> static constexpr auto compute_type() { if constexpr (i == 42) { return TypeHolder<bool>{}; } else { return TypeHolder<T>{}; } } public: template<class T> using TheType = typename decltype(Outer<i>::compute_type<T>())::type; }; int main() …

2
クラスがデフォルトで構築できないのはなぜですか?
私はそれらのクラスを持っています: #include <type_traits> template <typename T> class A { public: static_assert(std::is_default_constructible_v<T>); }; struct B { struct C { int i = 0; }; A<C> a_m; }; int main() { A<B::C> a; } コンパイル時、a_mデフォルトでは構築できませんが可能aです。 に変更Cする場合: struct C { int i; }; すべて順調。 Clang 9.0.0でテスト済み。
28 c++ 

1
なぜC ++では、負の数のstatic_cast <unsigned>が定数かどうかによって異なる
equalがfalseであることを意味するC ++ルールは何ですか?与えられた: float f {-1.0}; bool equal = (static_cast&lt;unsigned&gt;(f) == static_cast&lt;unsigned&gt;(-1.0)); 例:https : //godbolt.org/z/fcmx2P #include &lt;iostream&gt; int main() { float f {-1.0}; const float cf {-1.0}; std::cout &lt;&lt; std::hex; std::cout &lt;&lt; " f" &lt;&lt; "=" &lt;&lt; static_cast&lt;unsigned&gt;(f) &lt;&lt; '\n'; std::cout &lt;&lt; "cf" &lt;&lt; "=" &lt;&lt; static_cast&lt;unsigned&gt;(cf) &lt;&lt; '\n'; return 0; …
28 c++  casting 

3
変換演算子のこのオーバーロードが選択されるのはなぜですか?
次のコードを検討してください。 struct any { template &lt;typename T&gt; operator T &amp;&amp;() const; template &lt;typename T&gt; operator T &amp;() const; }; int main() { int a = any{}; } ここで、2番目の変換演算子は、過負荷の解決によって選択されます。どうして? 私の理解する限り、2つの演算子はそれぞれoperator int &amp;&amp;() constとに推定されoperator int &amp;() constます。どちらも実行可能な関数のセットに含まれています。[over.match.best]を読んでも、後者が優れている理由を理解するのに役立ちませんでした。 なぜ後者は前者よりも機能が優れているのですか?

2
「これ」がラムダによってキャプチャされた場合、明示的に使用する必要がありますか?
thisラムダでのキャプチャが明示的に使用することがわかった例。例えば: capturecomplete = [this](){this-&gt;calstage1done();}; しかし、それを暗黙的に使用することも可能であるようです。例えば: capturecomplete = [this](){calstage1done();}; これをg ++でテストし、コンパイルしました。 これは標準のC ++ですか?(もしそうなら、どのバージョンか)、またはそれは何らかの拡張形式ですか?

2
並べ替えられたグループでは、並べ替えられていないグループよりもグループ化された合計が遅いのはなぜですか?
タブ区切りの整数が2列あります。1つ目はランダムな整数、2つ目はこのプログラムで生成できるグループを識別する整数です。(generate_groups.cc) #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;ctime&gt; int main(int argc, char* argv[]) { int num_values = atoi(argv[1]); int num_groups = atoi(argv[2]); int group_size = num_values / num_groups; int group = -1; std::srand(42); for (int i = 0; i &lt; num_values; ++i) { if (i % group_size == 0) { ++group; …
27 c++  performance 

3
C ++が2番目のテンプレート引数を推測しないようにするにはどうすればよいですか?
私はC ++ライブラリ(strf)を使用していますが、その中には、次のコードが含まれています。 namespace strf { template &lt;typename ForwardIt&gt; inline auto range(ForwardIt begin, ForwardIt end) { /* ... */ } template &lt;typename Range, typename CharT&gt; inline auto range(const Range&amp; range, const CharT* sep) { /* ... */ } } 今、strf::range&lt;const char*&gt;(some_char_ptr, some_char_ptr + some_length)私のコードで使用したいと思います。しかし、そのようにすると、次のエラーが発生します(CUDA 10.1のNVCCを使用)。 error: more than one instance of …

4
void * function()は関数へのポインターですか、それともvoid *を返す関数ですか?
の意味がわかりませんvoid *function()。 それは関数へのポインタvoid*ですか、それとも関数が戻りますか?私は常にポインタを返す再帰関数としてデータ構造で使用しましたが、マルチスレッド(pthread)でコードを見たとき、同じ関数宣言があります。今、私はそれらの違いが何であるか混乱しています。

3
C ++でタイプリストの方法デカルト積を作成するにはどうすればよいですか?
自明です。 基本的に、次のようなタイプのリストがあるとします。 using type_list_1 = type_list&lt;int, somestructA&gt;; using type_list_2 = type_list&lt;somestructB&gt;; using type_list_3 = type_list&lt;double, short&gt;; タイプリストの可変数にすることができます。 デカルト積のタイプリストを取得するにはどうすればよいですか? result = type_list&lt; type_list&lt;int, somestructB, double&gt;, type_list&lt;int, somestructB, short&gt;, type_list&lt;somestructA, somestructB, double&gt;, type_list&lt;somestructA, somestructB, short&gt; &gt;; 私はここに与えられているように双方向のデカルト積を作成する方法について手を出しました:タイプリストのデカルト積を作成する方法?、しかしnウェイはそれほど簡単ではないようです。 とりあえずやっています... template &lt;typename...&gt; struct type_list{}; // To concatenate template &lt;typename... Ts, typename... Us&gt; constexpr auto …

3
const参照によってデフォルトの引数の値を返すことは問題ありませんか?
以下の例のようにconst参照によってデフォルトの引数の値を返すことは問題ありませんか? https://coliru.stacked-crooked.com/a/ff76e060a007723b #include &lt;string&gt; const std::string&amp; foo(const std::string&amp; s = std::string("")) { return s; } int main() { const std::string&amp; s1 = foo(); std::string s2 = foo(); const std::string&amp; s3 = foo("s"); std::string s4 = foo("s"); }

2
std :: pair内の初期化子リスト
このコード: #include &lt;iostream&gt; #include &lt;string&gt; std::pair&lt;std::initializer_list&lt;std::string&gt;, int&gt; groups{ { "A", "B" }, 0 }; int main() { for (const auto&amp; i : groups.first) { std::cout &lt;&lt; i &lt;&lt; '\n'; } return 0; } コンパイルしますが、segfaultを返します。どうして? gcc 8.3.0とオンラインコンパイラでテストされています。
26 c++  std  std-pair 

4
ifディレクティブマクロ比較
#if次のコードの条件が満たされるのはなぜですか。 #include &lt;iostream&gt; #define VALUE foo int main() { #if VALUE == bar std::cout &lt;&lt; "WORKS!" &lt;&lt; std::endl; #endif // VALUE }

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.