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

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


11
c ++ 11で整数スレッドIDを取得する方法
c ++ 11には現在のスレッドIDを取得する可能性がありますが、整数型にキャストすることはできません。 cout<<std::this_thread::get_id()<<endl; 出力:139918771783456 cout<<(uint64_t)std::this_thread::get_id()<<endl; エラー:タイプ 'std :: thread :: id'からタイプ 'uint64_t'への無効なキャスト他のタイプと同じ:タイプ 'std :: thread :: id'からタイプ 'uint32_t'への無効なキャスト 整数のスレッドIDを取得するためにポインターキャストを実行したくありません。それを行うための合理的な方法(ポータブルにしたいので標準)はありますか?

3
移動したコンテナを再利用しますか?
移動したコンテナを再利用する正しい方法は何ですか? std::vector<int> container; container.push_back(1); auto container2 = std::move(container); // ver1: Do nothing //container2.clear(); // ver2: "Reset" container = std::vector<int>() // ver3: Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2); 私がC ++ 0x標準ドラフトで読んだものから。ver3は正しい方法のようです。移動後のオブジェクトは、 「特に明記されていない限り、そのような移動元のオブジェクトは、有効であるが指定されていない状態に置かれるものとします。」 「他の方法で指定された」インスタンスは見つかりませんでした。 ver3は少し回り道で、ver1の方がはるかに好ましいと思いますが、vec3は追加の最適化を可能にしますが、一方で、簡単に間違いを引き起こす可能性があります。 私の仮定は正しいですか?

2
変数を宣言するときに、C ++で変数名を括弧で囲むことができるのはなぜですか?
たとえば、次のような宣言: int (x) = 0; またはそれでも: int (((x))) = 0; 私のコードに次のようなフラグメントがあったため、これに遭遇しました。 struct B { }; struct C { C (B *) {} void f () {}; }; int main() { B *y; C (y); } 明らかにC、デストラクタで役立つ何かを実行するオブジェクトを作成したかったのです。ただし、コンパイラは型C (y);を使用した変数の宣言として処理するため、再定義に関するエラーが出力されます。興味深いのは、私がそれをそのように、またはそのようなものとして書くと、意図したとおりにコンパイルされるということです。もちろん、最新の最善の回避策は、コンストラクター呼び出しで使用することです。yCyC (y).f ()C (static_cast<B*> (y)){} そのため、後で理解したように、int (x) = 0;またはのような変数を宣言することは可能ですが、int (((x))) = 0;実際にこのような宣言を使用している人を見たことがありません。だから私は興味があります-今のところ、それは悪名高い「最も厄介な解析」に似たケースを作成するだけで、有用なものは何も追加しないので、そのような可能性の目的は何ですか?

1
C ++ 11での文字列リテラルのUnicodeエンコーディング
関連する質問に続いて、C ++ 11の新しい文字と文字列リテラルタイプについて質問したいと思います。現在、4種類の文字と5種類の文字列リテラルがあるようです。文字タイプ: char a = '\x30'; // character, no semantics wchar_t b = L'\xFFEF'; // wide character, no semantics char16_t c = u'\u00F6'; // 16-bit, assumed UTF16? char32_t d = U'\U0010FFFF'; // 32-bit, assumed UCS-4 そして文字列リテラル: char A[] = "Hello\x0A"; // byte string, "narrow encoding" wchar_t B[] = L"Hell\xF6\x0A"; …

3
C ++ 17以降、正しいアドレスとタイプのポインターは常に有効なポインターですか?
(この質問と回答を参照してください。) C ++ 17標準の前は、次の文が[basic.compound] / 3に含まれていました。 タイプTのオブジェクトがアドレスAにある場合、値がアドレスAであるタイプcv T *のポインターは、値の取得方法に関係なく、そのオブジェクトを指していると言われます。 しかし、C ++ 17以降、この文は削除されました。 たとえば、この文によってこのサンプルコードが定義され、C ++ 17以降は未定義の動作であると思います。 alignas(int) unsigned char buffer[2*sizeof(int)]; auto p1=new(buffer) int{}; auto p2=new(p1+1) int{}; *(p1+1)=10; C ++ 17より前p1+1は、へのアドレスを保持し*p2、正しい型を持っているので*(p1+1)、へのポインタもそうです*p2。C ++で17p1+1ある過去エンドポインタになっていないので、オブジェクトへのポインタと、私はそれがdereferencableではないと信じています。 この標準的な権利の変更の解釈ですか、それとも引用された文の削除を補償する他の規則がありますか?

6
std :: threadがまだ実行されているかどうかを確認する方法は?
std::threadがまだ実行されているかどうかを(プラットフォームに依存しない方法で)確認するにはどうすればよいですか?それはtimed_join()方法を欠いており、そのためのものでjoinable()はありません。 std::lock_guardスレッド内のaでミューテックスをロックし、ミューテックスのtry_lock()メソッドを使用して、それがまだロックされている(スレッドが実行されている)かどうかを判断することを考えましたが、不必要に複雑に思えます。 もっとエレガントな方法を知っていますか? 更新:明確にするために:スレッドが正常に終了したかどうかを確認したいと思います。「ぶら下がっている」スレッドは、この目的で実行されていると見なされます。


6
std :: get_temporary_bufferが必要なのはなぜですか?
どのような目的で使用する必要がありますstd::get_temporary_bufferか?標準は次のように言っています: 最大n個の隣接するTオブジェクトを格納するのに十分なストレージへのポインタを取得します。 バッファはスタックに割り当てられると思いましたが、そうではありません。C ++標準によると、このバッファは実際には一時的なものではありません。この関数には::operator new、オブジェクトも作成しないグローバル関数に比べてどのような利点がありますか。次のステートメントが同等であるというのは正しいですか? int* x; x = std::get_temporary_buffer<int>( 10 ).first; x = static_cast<int*>( ::operator new( 10*sizeof(int) ) ); この関数はシンタックスシュガーに対してのみ存在しますか?なぜtemporaryその名前にあるのですか? 1996年7月1日のDr.Dobb's Journalで、アルゴリズムを実装するための1つのユースケースが提案されました。 バッファを割り当てることができない場合、またはバッファが要求よりも小さい場合でも、アルゴリズムは正しく機能します。単に速度が低下するだけです。

5
未定義の動作とシーケンスポイントがリロードされました
このトピックを次のトピックの続編と考えてください。 前の記事 未定義の動作とシーケンスポイント この面白くて複雑な表現をもう一度見てみましょう(イタリック体のフレーズは上記のトピック* smile *から取られています): i += ++i; これは未定義の振る舞いを引き起こすと言います。これを言うとき、私たちは暗黙のうちにタイプが組み込みタイプのi1つであると仮定していると思います。 の型がiユーザー定義型の場合はどうなりますか?そのタイプはIndex、この投稿の後半で定義されていると言います(以下を参照)。それでも未定義の振る舞いを呼び出しますか? はいの場合、なぜですか?それは書くことと同等ではありませんi.operator+=(i.operator++());か、あるいは構文的に単純 i.add(i.inc());ですか?または、それらも未定義の振る舞いを呼び出しますか? いいえの場合、なぜですか?結局のところ、オブジェクトiは連続するシーケンスポイント間で2回変更されます。経験則を思い出してください。式は、連続する「シーケンスポイント間でオブジェクトの値を1回だけ変更できます。また、i += ++iが式の場合 、undefined-behaviorを呼び出す必要があります。その場合、同等のものi.operator+=(i.operator++());で i.add(i.inc());あり、undefined-behaviorも呼び出す必要があります。真実ではないようです!(私が理解している限り) または、i += ++iそもそも表現ではないですか?もしそうなら、それは何ですか、そして表現の定義は何ですか? それが式であると同時に、その動作も明確に定義されている場合、式に関連付けられているシーケンスポイントの数は、式に含まれるオペランドのタイプに何らかの形で依存することを意味します。私は(部分的にでも)正しいですか? ちなみに、この表現はどうですか? //Consider two cases: //1. If a is an array of a built-in type //2. If a is user-defined type which overloads the subscript operator! a[++i] = i; …

4
Photoshopは2つの画像をどのようにブレンドしますか?[閉まっている]
閉まっている。この質問は、StackOverflowのガイドラインを満たしていません。現在、回答を受け付けていません。 この質問を改善したいですか?質問を更新して、StackOverflowのトピックになります。 昨年休業。 この質問を改善する アプリケーションで同じ効果を再現できるように、Photoshopが2つの画像をブレンドする方法を誰かに説明してもらえますか。


2
c ++ 0xでnullptrを削除しても安全ですか?
でc++03、nullポインタを削除しても効果がないことは明らかです。確かに、それはその中で明確に述べられ§5.3.5/2ています: どちらの方法でも、deleteのオペランドの値がnullポインターの場合、操作は効果がありません。 ただし、この文の現在のドラフトではc++0x欠落しているようです。ドラフトの残りの部分では、delete-expressionのオペランドがnullポインター定数でない場合に何が起こるかを示す文しか見つかりませんでした。ヌルポインタの削除はまだで定義されてc++0xいますか?もしそうなら、どこで? ノート: それがまだ十分に定義されていることを示唆する重要な状況証拠があります。 まず、次のように§5.3.5/2述べている2つの文があります 最初の選択肢(オブジェクトの削除)では、deleteのオペランドの値はnullポインター値である可能性があります... そして 2番目の選択肢(配列の削除)では、deleteのオペランドの値はnullポインター値または... これらは、オペランドがnullであることが許可されていることを示していますが、それ自体では、nullの場合に何が起こるかを実際には定義していません。 第二に、の意味を変更することdelete 0は大きな重大な変更であり、標準化委員会がこの特定の変更を行う可能性はほとんどありません。さらに、これがc++0xドラフトの互換性アネックス(アネックスC)の重大な変更であるという言及はありません。ただし、附属書Cは有益なセクションであるため、これには規格の解釈は含まれていません。 一方、nullポインタを削除しても効果がないという事実は、追加の実行時チェックを意味します。多くのコードでは、オペランドがnullになることはないため、このランタイムチェックはオーバーヘッドゼロの原則と矛盾します。たぶん、委員会は、標準のc ++を言語の指定された設計目標にさらに一致させるために、動作を変更することを決定しました。

7
gccを使用したC ++プログラムのコンパイル
質問:gccコンパイラでC ++プログラムをコンパイルする方法は? info.c: #include<iostream> using std::cout; using std::endl; int main() { #ifdef __cplusplus cout << "C++ compiler in use and version is " << __cplusplus << endl; #endif cout <<"Version is " << __STDC_VERSION__ << endl; cout << "Hi" << __FILE__ << __LINE__ << endl; } そして私がコンパイルしようとすると info.c $ gcc …
84 c++  gcc  g++  gnu 

4
std :: flushはどのように機能しますか?
誰かが(できれば平易な英語を使って)どのようにstd::flush機能するかを説明できますか? それは何ですか? いつストリームをフラッシュしますか? どうしてそれが重要ですか? ありがとうございました。
84 c++  stream 

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