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

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

1
スパンをconstexprにすることはできますか?
std :: spanのすべてのコンストラクターはconstexprと宣言されていますが、それらのいずれかをconstexprコンテキストで動作させることはできません。以下のconstexprのコメントを外すと、コンパイルエラーが発生します。 #include <array> #include <span> int main() { constexpr int carray[3] = { 0, 1, 2 }; constexpr std::array<int, 3> array{ 0, 1, 2 }; using S = std::span<const int, 3>; /*constexpr*/ S span1{ array.data(), 3 }; /*constexpr*/ S span2{array.begin(), array.end()}; /*constexpr*/ S span3{carray}; /*constexpr*/ S span4{array}; } …
11 c++  constexpr  c++20 



5
ラムダのC ++三項割り当て
次のスニペットがコンパイルされない理由は何ですか?「エラー:オペランドの?:タイプが異なります」というエラーが表示されます。 auto lambda1 = [&](T& arg) { ... }; auto lambda2 = [&](T& arg) { ... }; auto lambda = condition ? lambda1 : lambda2;

6
無害な範囲ベースのforループが機能しない
以下はコンパイルされません: #include <iostream> int main() { int a{},b{},c{},d{}; for (auto& s : {a, b, c, d}) { s = 1; } std::cout << a << std::endl; return 0; } ゴッドボルトで試してみてください コンパイラエラーは次のとおりです。 error: assignment of read-only reference 's' 今私の実際の場合、リストはクラスのメンバー変数で構成されています。 これで、式がinitializer_list<int>実際にa、b、c、およびdをコピーするになるため、これは機能しません。したがって、変更もできません。 私の質問は2つあります。 このように範囲ベースのforループを記述できないようにする動機はありますか? 例えば。おそらく、裸のブレース式の特別なケースがあるかもしれません。 このタイプのループを修正する構文上のきちんとした方法は何ですか? この線に沿ったものが好ましいでしょう: for (auto& s : something(a, b, …


2
戻り値の型を明示的に述べているにもかかわらず、ラムダの呼び出しがあいまいです
オーバーロードされた関数は、ラムダのタイプが決定可能であることを前提に、両方のファンクターを取り込む必要があります(キャスト可能(std::function私が間違っている場合は修正してください)。定義されていますか?([&]() -> Type {}) 現在のソリューションでは、参照によるキャプチャが必要なため、コードにそのロジックが含まれていることに注意してください。 次の例は、問題について説明しています。 #include <iostream> #include <string> #include <functional> void do_some(std::function<void(int)> thing) { thing(5); } void do_some(std::function<bool(int)> thing) { if (thing(10)) { std::cout << "it's true!" << std::endl; } } int main() { int local_to_be_modified = 0; do_some( [&](int in) { local_to_be_modified = in; std::cout << "This …

1
変数テンプレートをテンプレートテンプレート引数として渡すことはできますか?
次の無意味な例はコンパイルされませんが、変数テンプレートをテンプレートテンプレート引数として渡す他の方法はありますか? template<typename T> constexpr auto zero = T{0}; template<typename T, template<typename> auto VariableTemplate> constexpr auto add_one() { return VariableTemplate<T> + T{1}; } int main() { return add_one<int, zero>(); } コンパイラエクスプローラーを試す


1
WindowsでCMakeを構成し、コマンドラインからclangを使用して最新のOpenMPサポートを取得する
並列化にOpenMPを使用する小さなテストプロジェクトがあります。私の目標は、OpenMP 4.5以降のサポートを備えたライブラリ(これらのタイプを使用して配布された外部ライブラリへの実際のプロジェクトリンクのため)を生成.dllし.libてライブラリ用にコンパイルし、コマンドラインから実行して、Dockerで実行できるようにすることですテストとチェック(Dockerの部分はこの質問の範囲外です。これは、コマンドラインから機能させる必要がある理由の参考に過ぎません)。私はこのプロジェクトを別のコンパイラーでコンパイルできますが、満足できないものがあります。 MSVC:、mkdir build-msvc次にcmake ..(新しく作成されたフォルダーから)、最後にcmake --build . --config Release。これは問題なくコンパイルできますが、OpenMP 2.0のみをサポートしているため、実際のプロジェクトには適していません。 Intel Parallel Studio:、mkdir build-intel次にcmake .. -T "Intel C++ Compiler 19.0"(新しく作成されたフォルダーから)、最後にcmake --build . --config Release。これはOpenMP 5.0をサポートしていますが、そのライセンスは私にとってかなり高価です。 MinGW x64 g ++:、mkdir build-g++次にcmake .. -G "MinGW Makefiles"(新しく作成されたフォルダーから)、最後にcmake --build .。これはOpenMP 4.5をサポートしていますが、このコンパイラーは.lib(私が知る限り)互換性がなく、すでに述べたように必要です。 私は成功せずにclangを使用しようとしました: MSVCからのCLANG:、mkdir build-clang-msvc次にcmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(新しく作成されたフォルダーから)、次のエラーで失敗します。 -CXXコンパイラIDは、MSVCに似たコマンドラインを備えたClang 8.0.1です。 -動作するCXXコンパイラを確認します:C:/ Program Files(x86)/ Microsoft …

2
weak_ptrのリセットはshared_ptrに影響しますか?
私は使用にあまり慣れておらずweak_ptr、かなり混乱する状況に直面しています。Intel XE 2019 Composer update 5(パッケージ2019.5.281)をVisual Studio 2019 ver。と組み合わせて使用しています。16.2.5。64ビットでコンパイルします。標準のC ++ 17を使用しています。 これが私のスパイクソリューションのコードです。 #include <memory> #include <iostream> using namespace std; int main( int argc, char* argv[] ) { shared_ptr<int> sp = make_shared<int>( 42 ); cout << "*sp = " << *sp << endl; weak_ptr<int> wp = sp; cout << "*sp = …

3
std :: transformを並列実行ポリシーで使用できますか?
間違えなければ 、入出力イテレータと同じ範囲を使ってその場でstd::transform実行させることができます。私がいくつかのstd::vectorオブジェクトを持っていると仮定してvec、私は書くでしょう std::transform(vec.cbegin(),vec.cend(),vec.begin(),unary_op) 適切な単項演算を使用しますunary_op。 C ++ 17標準を使用しstd::execution::parて、最初の引数としてinを付けて、変換を並列実行したいと思います。これにより、関数がのcppreference記事のstd::transformオーバーロード(1)から(2)に変わります。ただし、このオーバーロードへのコメントは次のように述べています。 unary_op[...]終了反復子を含むすべての反復子を無効にしたり、関係する範囲の要素を変更したりしてはなりません。(C ++ 11以降) 「要素を変更する」とは、実際にアルゴリズムを使用できないことを意味しますか、それとも、誤って解釈した別の詳細について話しているのですか?

7
ベクター内の要素のErasing()が機能しない
ベクターを持っています。その中の最後の3つの要素を削除する必要があります。このロジックについて説明しました。プログラムがクラッシュします。何が間違いでしょうか? vector<float>::iterator d = X.end(); for (size_t i = 1; i < 3; i++) { if (i == 1) X.erase(d); else X.erase(d - i); }
10 c++  vector 

1
C ++の変数を介して構造体のメンバーにアクセスする
たとえば、2つのメンバーを持つ構造体があります。 struct DataSet { int x; int y; }; ...、そして私はメソッドでそれらにアクセスする必要がありますが、一度に1つだけです、例えば: void foo(StructMember dsm) { // ("StructMember" does not exist) DataSet ds; ds.x = 4; ds.y = 6; std::cout << ds.dsm * ds.dsm << std::endl; } foo(x); foo(y); 私が欲しい出力: 16 36 このような問題を解決する必要がある場合はどうすればよいですか?メンバーにアクセスできるデータ型はありますか?
10 c++ 

2
C ++テンプレートテンプレート引数タイプの控除
文字列のコンテナを調べて、パターンの一致を見つけて出力するコードがあります。テンプレート化された関数fooで印刷が実行されます コード #include <iostream> #include <algorithm> #include <iterator> #include <vector> #include <string> #include <tuple> #include <utility> template<typename Iterator, template<typename> class Container> void foo(Iterator first, Container<std::pair<Iterator, Iterator>> const &findings) { for (auto const &finding : findings) { std::cout << "pos = " << std::distance(first, finding.first) << " "; std::copy(finding.first, finding.second, std::ostream_iterator<char>(std::cout)); …

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