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

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


4
1.0に最も近いdoubleは何ですか、それは1.0ではありませんか?
プログラムで1.0に最も近いdoubleを取得する方法はありますが、実際には1.0ではありませんか? これを行うハックな方法の1つは、doubleを同じサイズの整数にmemcpyしてから、1を減算することです。IEEE754浮動小数点形式が機能する方法では、これにより、小数部をすべてゼロ(1.000000000000)からすべて1(1.111111111111)に変更しながら、指数が1つ減少します。ただし、整数がリトルエンディアンで格納され、浮動小数点がビッグエンディアンで格納されるマシンが存在するため、常に機能するとは限りません。


3
void * a =&aはどのように合法ですか?
次のC ++コードを考えてみます。 void* a = &a; 宣言されていない識別子を使用するとコンパイラが文句を言わないのはなぜですか? また、コンパイラは変数aを何と見なしていますか?それはvoidオブジェクトへのvoid*ポインターですか、それともポインターへのポインターですか?
88 c++ 


3
プライベートコンストラクターがプライベートコンストラクターではないのはいつですか?
タイプがあり、そのデフォルトのコンストラクタをプライベートにしたいとします。私は次のように書きます: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); // …

4
JavaはC ++のstd :: vectorよりも配列の方が8倍高速です。何を間違えたのですか?
サイズが変更されないいくつかの大きな配列を持つ次のJavaコードがあります。私のコンピューターでは1100ミリ秒で実行されます。 同じコードをC ++に実装して使用しましたstd::vector。 まったく同じコードを実行するC ++実装の時間は、私のコンピューターでは8800ミリ秒です。これがゆっくり実行されるように、私は何を間違えましたか? 基本的に、コードは次のことを行います。 for (int i = 0; i < numberOfCells; ++i) { h[i] = h[i] + 1; floodedCells[i] = !floodedCells[i]; floodedCellsTimeInterval[i] = !floodedCellsTimeInterval[i]; qInflow[i] = qInflow[i] + 1; } サイズが約20000のさまざまな配列を反復処理します。 次のリンクの下に両方の実装があります。 Java:https : //ideone.com/R8KqjT C ++:https : //ideone.com/Lu7RpE (ideoneでは、時間制限のため、ループを2000回ではなく400回しか実行できませんでした。ただし、ここでも3回の違いがあります)

8
動作が未定義のブランチは到達不能と見なされ、デッドコードとして最適化されますか?
次のステートメントを検討してください。 *((char*)NULL) = 0; //undefined behavior 明らかに未定義の動作を引き起こします。特定のプログラムにそのようなステートメントが存在するということは、プログラム全体が未定義であること、または制御フローがこのステートメントにヒットしたときにのみ動作が未定義になることを意味しますか? 次のプログラムは、ユーザーが番号を入力しない場合に備えて明確に定義されています3か? while (true) { int num = ReadNumberFromConsole(); if (num == 3) *((char*)NULL) = 0; //undefined behavior } それとも、ユーザーが何を入力しても、完全に未定義の動作ですか? また、コンパイラは、未定義の動作が実行時に実行されないことを想定できますか?これにより、時間を遡って推論することができます。 int num = ReadNumberFromConsole(); if (num == 3) { PrintToConsole(num); *((char*)NULL) = 0; //undefined behavior } ここで、コンパイラーは、num == 3未定義の動作を常に呼び出す場合に備えて推論することができます。したがって、このケースは不可能でなければならず、番号を印刷する必要はありません。ifステートメント全体を最適化することができます。この種の後方推論は規格に従って許可されていますか?

3
Boost.Logロギングライブラリの使用経験はありますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。私たちは回答が事実、参考文献、または専門知識によってサポートされることを期待しますが、この質問はおそらく議論、議論、投票、または拡張された議論を誘います。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 Boost.Logロギングライブラリの使用を開始することを検討しています。誰かがBoost.Logを使用していますか?この点に関するあなたの経験を共有してください。 私が検討している他のライブラリは、Apache log4cxx(インストールするのは面倒なようですが、私のチームメイトは簡単なものから始めたいです)とPantheios(追加のフロントエンドとバックエンドで動作するため同じ問題)です。
88 c++  boost  logging  boost-log 


6
ラムダ式を返す関数
C ++ 11でラムダ関数を返す関数を書くことは可能だろうか。もちろん、1つの問題は、そのような関数をどのように宣言するかです。各ラムダには型がありますが、その型はC ++では表現できません。私はこれがうまくいくとは思いません: auto retFun() -> decltype ([](int x) -> int) { return [](int x) { return x; } } これも: int(int) retFun(); ラムダから関数へのポインターなどへの自動変換については知りません。関数オブジェクトを手作りして返す唯一の解決策はありますか?
88 c++  function  c++11  lambda 

4
int(*)(int *)= 5(または任意の整数値)の意味
私はこれを理解することはできません: int main() { int (*) (int *) = 5; return 0; } 上記の割り当ては、g ++ c ++ 11でコンパイルされます。それint (*) (int *)が(int *)引数として受け入れてintを返す関数へのポインタであることは知っていますが、それを5と同等にする方法がわかりません。最初は、常に5を返す関数だと思いました(最近の学習からF#、おそらくハハ)、それから私は簡単に、関数ポインタがメモリ位置5を指していると思いましたが、それは明らかに機能せず、16進値も機能しません。 関数がintを返すためである可能性があり、intの割り当ては(どういうわけか)大丈夫だと考えて、私もこれを試しました: int * (*) (int *) = my_ptr ここmy_ptrで、は型int *であり、int型の最初の場合と同様に、この2番目の関数ポインタと同じ型です。これはコンパイルされません。の代わりに5または任意のint値を割り当ててもmy_ptr、この関数ポインターに対してはコンパイルされません。 では、割り当てはどういう意味ですか? アップデート1 ベストアンサーに示されているように、これはバグであることが確認されています。ただし、関数ポインタに割り当てた値に実際に何が起こるのか、または割り当てで何が起こるのかはまだわかりません。それについての(良い)説明は大歓迎です!問題をより明確にするために、以下の編集を参照してください。 編集1 gccバージョン4.8.2(Ubuntu 4.8.2)を使用しています 編集2 実際、それを何かと同等にすることは私のコンパイラで機能します。std :: string変数、またはdoubleを返す関数名と同等でも機能します。 2.1を編集 興味深いことに、ポインタではないデータ型を返す関数への関数ポインタにすると、次のようにコンパイルできます。 std::string (*) () = 5.6; しかし、関数ポインタが何らかのポインタを返す関数を指すとすぐに、次のようにコンパイルされません。 …

6
C ++ 11で(同じタイプの)ラムダのベクトルを作成できないのはなぜですか?
ラムダのベクトルを作成しようとしましたが、失敗しました。 auto ignore = [&]() { return 10; }; //1 std::vector<decltype(ignore)> v; //2 v.push_back([&]() { return 100; }); //3 2行目までは、正常にコンパイルされます。しかし、3行目はコンパイルエラーを出します: エラー: 'std :: vector <main():: <lambda()>> :: push_back(main():: <lambda()>)'の呼び出しに一致する関数がありません 関数ポインタのベクトルや関数オブジェクトのベクトルは必要ありません。ただし、実際のラムダ式をカプセル化する関数オブジェクトのベクトルは、私にとっては機能します。これは可能ですか?
88 c++  vector  lambda  c++11 

10
致命的なエラーLNK1104:ファイルを開くことができません 'libboost_system-vc110-mt-gd-1_51.lib'
これを機能させることができないようです。websocket++ライブラリを必要とする単純なコンソールアプリケーション(ライブラリに依存)を作成しBoostましたが、コンパイルしようとすると次のようになります。 致命的なエラーLNK1104:ファイルを開くことができません 'libboost_system-vc110-mt-gd-1_51.lib' ただし、ライブラリを作成するbjamを実行(boost_root)/stage/libsし、ライブラリへのパスをコンパイラにリンクしましたC++/Additionnals includes。 私(boost_root)/stage/libsがファイル を見るとlibboost_system-vc110-mt-gd-1_51.libそこにありません。libboost_system-vc110-mt-sgd-1_51.lib代わりに呼び出されます。 何か案が?
88 c++  boost 


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