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

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

8
const参照としてのラムダキャプチャ?
ラムダ式でconst参照によってキャプチャすることは可能ですか? 以下にマークされている割り当てを失敗させたい、例えば: #include <cstdlib> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { string strings[] = { "hello", "world" }; static const size_t num_strings = sizeof(strings)/sizeof(strings[0]); string best_string = "foo"; for_each( &strings[0], &strings[num_strings], [&best_string](const string& s) { best_string = s; // this should fail } ); return …
166 c++  c++11  lambda  c++14 

2
「条件付きジャンプまたは移動は初期化されていない値に依存している」valgrindメッセージを正確に示す
したがって、valgrindからいくつかの不思議な初期化されていない値のメッセージを受け取っており、それは悪い値がどこから発生したのかという非常に謎です。 valgrindは、単一化された値が最終的に使用される場所を示しているようですが、初期化されていない値の原点は示していません。 ==11366== Conditional jump or move depends on uninitialised value(s) ==11366== at 0x43CAE4F: __printf_fp (in /lib/tls/i686/cmov/libc-2.7.so) ==11366== by 0x43C6563: vfprintf (in /lib/tls/i686/cmov/libc-2.7.so) ==11366== by 0x43EAC03: vsnprintf (in /lib/tls/i686/cmov/libc-2.7.so) ==11366== by 0x42D475B: (within /usr/lib/libstdc++.so.6.0.9) ==11366== by 0x42E2C9B: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, …
166 c++  valgrind 


1
静的メンバー関数エラー。署名を適切に書き込む方法は?
現在の署名を使用してg ++でコードをコンパイルしようとすると、エラーが発生します。 cannot declare member function static void Foo::Bar(std::ostream&, const Foo::Node*) to have static linkage 私の質問は2つあります。 なぜこの方法でコンパイルしないのですか? 正しいシグネチャは何ですか?なぜですか? C ++を使用しているとき、署名は常に私を死に至らせてきました 編集:これもクラスヘッダーファイルです。 class Foo { public: Foo(); ~Foo(); bool insert(const Foo2 &v); Foo * find(const Foo2 &v); const Foo * find(const Foo2 &v) const; void output(ostream &s) const; private: //Foo(const Foo …

9
マルチスレッドのCまたはC ++プログラミングでvolatileが役に立たないと見なされるのはなぜですか?
私が最近投稿したこの回答で示されているように、私はvolatileマルチスレッドプログラミングコンテキストでのユーティリティ(またはその欠如)について混乱しているようです。 私の理解はこれです。変数にアクセスするコードの制御の流れの外で変数が変更される可能性がある場合は常に、その変数をとして宣言する必要がありますvolatile。シグナルハンドラー、I / Oレジスター、および別のスレッドによって変更された変数はすべて、このような状況を構成します。 したがって、グローバルintがありfoo、foo1つのスレッドによって読み取られ、別のスレッドによって(おそらく適切なマシン命令を使用して)アトミックに設定されている場合、読み取りスレッドは、シグナルハンドラーによって微調整された変数を見るのと同じようにこの状況を認識します。外部ハードウェア条件によって変更されるため、foo宣言する必要がありますvolatile(または、マルチスレッドの状況では、メモリフェンスの負荷でアクセスします。これはおそらくより良い解決策です)。 どのように、どこで私は間違っていますか?


11
pImplイディオムは実際に実際に使用されていますか?
私はHerb Sutterの「Exceptional C ++」という本を読んでいます。その本で、pImplイディオムについて学びました。基本的には、のprivateオブジェクトの構造を作成し、classそれらを動的に割り当てて、コンパイル時間を短縮します(また、プライベート実装をより適切に非表示にする)。 例えば: class X { private: C c; D d; } ; 次のように変更できます: class X { private: struct XImpl; XImpl* pImpl; }; CPPでの定義: struct X::XImpl { C c; D d; }; これはかなり興味深いようですが、これまでこの種のアプローチを見たことがありません。これまでに取り組んだ企業や、ソースコードを見たオープンソースプロジェクトでも見たことがありません。それで、このテクニックが実際に実際に使用されているのだろうか? どこでも使用できますか、それとも注意して使用しますか?また、この手法は、パフォーマンスが非常に重要な組み込みシステムでの使用をお勧めしますか?
165 c++  oop  pimpl-idiom 

11
サブクラスへのポインターでの削除は、基本クラスのデストラクターを呼び出しますか?
私は、class Aそのフィールドの1つにヒープメモリ割り当てを使用しています。クラスAはインスタンス化され、別のクラス(class B。 クラスBのオブジェクトが完了したら、を呼び出しますdelete。これは、デストラクターを呼び出すと想定しています...しかし、これはクラスAのデストラクターも呼び出しますか? 編集: 答えから、私はそれを採用します(間違っている場合は編集してください): delete BのインスタンスがB ::〜B();を呼び出す 呼び出す A::~A(); A::~A deleteAオブジェクトのヒープに割り当てられたすべてのメンバー変数を明示的に指定する必要があります。 場合-最後のメモリブロックの記憶は、クラスBのインスタンスがヒープに返される前記新しいは、それが最初にすべてのデストラクタがオブジェクトを完成させるために呼び出された今後、それを初期化するコンストラクタを呼び出し、次に、ヒープ上のメモリのブロックを割り当てられ、使用されましたオブジェクトが常駐していたブロックがヒープに返されます。

14
ヒープ破損エラーをデバッグする方法は?
Visual Studio 2008で(ネイティブ)マルチスレッドC ++アプリケーションをデバッグしています。一見ランダムな状況で、「Windowsがブレークポイントをトリガーしました...」というエラーが発生します。これは、ヒープ。これらのエラーは、すぐにアプリケーションをクラッシュさせるとは限りませんが、すぐにクラッシュする可能性があります。 これらのエラーの大きな問題は、破損が実際に発生した後にのみ表示されるため、特にマルチスレッドアプリケーションでは、追跡とデバッグが非常に困難になることです。 これらのエラーの原因は何ですか? どうすればデバッグできますか? ヒント、ツール、方法、啓蒙...は大歓迎です。
165 c++  windows  debugging  heap 

9
Windows(Visual C)のunistd.hに代わるものはありますか?
Unix用に書かれた比較的単純なコンソールプログラムをWindowsプラットフォーム(Visual C ++ 8.0)に移植しています。すべてのソースファイルには、存在しない "unistd.h"が含まれています。それを削除すると、「ランダム」、「ランダム」、および「getopt」のプロトタイプが欠落しているという不満が出ます。私はランダム関数を置き換えることができることを知っています、そして私はgetopt実装を見つけたりハックアップしたりできると確信しています。 しかし、他の人も同じ課題に直面していると思います。私の質問は、「unistd.h」のWindowsへの移植はありますか?少なくとも1つは、ネイティブWindows実装を備えた関数を含みます-パイプやフォークは必要ありません。 編集: 私が必要とするものの置き換えを含む、非常に独自の "unistd.h"を作成できることを知っています。これは、限定セットであるため、特にこの場合です。しかし、それは一般的な問題のように思われるので、誰かが機能のより大きなサブセットのためにすでに作業を行っているのではないかと思っていました。 職場では別のコンパイラや環境に切り替えることはできません-Visual Studioに行き詰まっています。
165 c++  c  windows  portability  unistd.h 

3
関数シグネチャでstd :: enable_ifを避ける必要があるのはなぜですか
スコットマイヤーズは、彼の次の本EC ++ 11の内容とステータスを投稿しました。この本の1つの項目は、「std::enable_if関数のシグネチャでの回避」である可能性があると書いています。 std::enable_if 関数の引数として、戻り値の型として、またはクラステンプレートまたは関数テンプレートのパラメーターとして使用して、関数またはクラスをオーバーロードの解決から条件付きで削除できます。 で、この質問すべての3つの解決策を示しています。 関数パラメーターとして: template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< std::is_same<U, int>::value >::type* = 0) { return 42; } template<typename U = T> U read(typename std::enable_if< std::is_same<U, double>::value >::type* = 0) { return 3.14; } }; テンプレートパラメータとして: template<typename T> struct Check2 …

15
実際には、なぜ異なるコンパイラがint x = ++ i + ++ i;の異なる値を計算するのでしょうか?
このコードを検討してください: int i = 1; int x = ++i + ++i; コンパイラーがこのコードをコンパイルすると仮定して、このコードに対して何を行うかについては、いくつかの推測があります。 両方とも++i戻り2、結果としてx=4。 1つ++iは戻り2、もう1つはを返し3、結果としてx=5。 両方とも++i戻り3、結果としてx=6。 私には、2番目の可能性が最も高いようです。2つの++演算子の1つがで実行されi = 1、iがインクリメントされ、結果2が返されます。次に、2番目の++演算子がで実行されi = 2、iがインクリメントされ、結果3が返されます。次に2、と3を足し合わせてを与え5ます。 ただし、このコードをVisual Studioで実行したところ、結果はでした6。私はコンパイラをよりよく理解しようとしていますが、何が結果につながる可能性があるのか​​疑問に思ってい6ます。私の唯一の推測は、コードは「組み込み」の並行性で実行できるということです。2つの++演算子が呼び出され、それぞれiがもう一方が戻る前にインクリメントされ、その後、両方ともが返されました3。これは、コールスタックの私の理解と矛盾するため、説明する必要があります。 結果またはC++結果につながるコンパイラーが実行できる(合理的な)ことは何ですか?46 注意 この例は、Bjarne Stroustrupのプログラミング:C ++(C ++ 14)を使用した原則と実践における未定義の動作の例として登場しました。 シナモンのコメントを参照してください。

12
C ++ forループの前には見たことがない
C ++アルゴリズムをC#に変換していました。私はこのforループに出くわしました: for (u = b.size(), v = b.back(); u--; v = p[v]) b[u] = v; C ++ではエラーは発生しませんが、C#ではエラーが発生します(intをboolに変換できません)。このforループが本当にわかりません。条件はどこにありますか? 誰か説明していただけますか? PS。チェックのために、ベクトルをリストに適合させるために、b.back()はb [b.Count-1]に対応していますか?
164 c#  c++  for-loop 

20
「for(;;)」は「while(TRUE)」よりも高速ですか?そうでない場合、なぜ人々はそれを使うのですか?
for (;;) { //Something to be done repeatedly } こういうのがよく使われているのを見てきましたが、なかなかおかしいと思いますが…とか、そういうふうに言った方がわかりやすいと思いませんwhile(true)か? 私は(プログラマーの多くが暗号コードに頼る理由と同じように)これがわずかなマージンであると思っていますか? なぜ、そしてそれは本当に価値があるのでしょうか?もしそうなら、なぜそれをこのように定義しないのですか: #define while(true) for(;;) 参照:どちらが速いか:while(1)またはwhile(2)?

5
二重コロンを使用して名前空間のクラスを前方宣言できないのはなぜですか?
class Namespace::Class; なぜこれをしなければならないのですか?: namespace Namespace { class Class; } VC ++ 8.0を使用すると、コンパイラーは以下を発行します。 エラーC2653:「名前空間」:クラスまたは名前空間名ではありません ここでの問題は、コンパイラがNamespaceクラスと名前空間のどちらであるかを判別できないことだと思いますか?しかし、これは単なる前方宣言なので、なぜこれが問題になるのでしょうか。 いくつかの名前空間で定義されたクラスを前方宣言する別の方法はありますか?上記の構文は、私が名前空間を「再開」し、その定義を拡張しているように感じます。Class実際に定義されていない場合はどうなりNamespaceますか?これにより、ある時点でエラーが発生しますか?
164 c++  namespaces 

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