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

このタグは、C ++ 11としてコンパイルする必要があるコードに使用します(C ++ 14以降で導入された機能は使用しません)。

8
「while(1);」を最適化する C ++ 0x
更新されました、以下を参照してください! C ++ 0xを使用すると、コンパイラーが次のスニペットの「Hello」を出力できるようになる #include <iostream> int main() { while(1) ; std::cout << "Hello" << std::endl; } スレッドと最適化機能に関係しているようです。しかし、これは多くの人を驚かせる可能性があるようです。 許可するためにこれが必要だった理由について誰かが良い説明をしていますか?参考までに、最新のC ++ 0xドラフトは次のように述べています。6.5/5 forステートメントの場合のfor-init-statementの外側のループ ライブラリI / O関数を呼び出さない。 揮発性オブジェクトにアクセスまたは変更しない、および 同期操作(1.10)またはアトミック操作(29節)を実行しない 実装は終了すると想定できます。[注:これは、終了が証明できない場合でも、空のループの削除などのコンパイラ変換を可能にすることを目的としています。—エンドノート] 編集: この洞察に満ちた記事は、その標準テキストについて述べています 残念ながら、「未定義の動作」という言葉は使用されていません。ただし、標準で「コンパイラはPを想定している可能性があります」と記載されている場合は常に、not-Pプロパティを持つプログラムはセマンティクスが未定義であることを意味します。 それは正しいですか、コンパイラは上記のプログラムの「バイ」を出力することを許可されていますか? ここにはさらに洞察に満ちたスレッドがあります。これはCへの類似の変更に関するもので、上記のリンクされた記事を書いた人によって開始されました。他の有用な事実の中で、それらはC ++ 0xにも適用されると思われる解決策を提示します(更新:これはn3225ではもう機能しません-下記を参照してください!) endless: goto endless; コンパイラはループではなくジャンプなので、それを最適化することはできません。別の男はC ++ 0xとC201Xで提案された変更を要約します ループを書き込むことによって、プログラマがアサートされているいずれかのループは、可視挙動を有するもの(実行I / O、アクセス揮発性オブジェクト、または実行同期または原子操作)をしていること、 またはそれが最終的に終了すること。副作用のない無限ループを作成してその仮定に違反すると、コンパイラーに嘘をついてしまい、プログラムの動作は未定義になります。(運が良ければ、コンパイラーが警告するかもしれません。)この言語は、目に見える動作なしで無限ループを表現する方法を提供していません(提供していませんか?)。 2011年3月31日にn3225で更新:委員会はテキストを1.10 / 24に移動し、 実装は、すべてのスレッドが最終的に次のいずれかを実行すると想定する場合があります。 終了、 …

7
boost :: threadとboost :: mutexを同等のc ++ 11に置き換えるのは賢明ですか?
動機:私が検討している理由は、私の天才プロジェクトマネージャーが、ブーストは別の依存関係であり、「あなたはそれに依存している」ために恐ろしいと思っているためです(ブーストの品質について説明しようとしましたが、しばらくしてから断念しました:( )。私がそれをしたい小さな理由は、人々がコードを書き始めるので、私はc ++ 11の機能を学びたいということです。 #include<thread> #include<mutex>同等のものの間で1:1のマッピングがありますか? boostのものをc ++ 11の ものに置き換えることをお勧めしますか?私の使用法は原始的ですが、stdが何を後押しするのか提供しない例はありますか?または(冒とく)その逆ですか? PS私はGCCを使用しているため、ヘッダーがあります。

6
main()が終了すると、切り離されたスレッドはどうなりますか?
私はそれを開始しているstd::threadと仮定しdetach()て、それstd::threadが一度それを表していたとしても、スレッドがスコープ外になったとしても、スレッドは実行を続けます。 さらに、プログラムには、切り離されたスレッド1に参加するための信頼できるプロトコルがないため、main()終了時に切り離されたスレッドが引き続き実行されると仮定します。 1.10と30.3のどちらにも適切な表現が含まれておらず、何が起こるかを説明している標準(より正確には、N3797 C ++ 14ドラフト)には何も見つかりません。 1別の、おそらく同等の質問は、「デタッチされたスレッドを再び結合できるか」です。これは、どのプロトコルを結合しようと考えている場合でも、スレッドがまだ実行されている間にシグナリング部分を実行する必要があるため、OSスケジューラが受信側がスレッドが実際に終了したことを確実に検出する方法がなく、シグナリングが実行された直後に、スレッドを1時間スリープさせることにしました。 が不足している場合はmain()デタッチスレッドが実行されているとすると、未定義の動作で、その後、任意の使用は、std::thread::detach()メインスレッドが終了したことがない場合を除き、未定義の動作です2。 したがって、main()デタッチされたスレッドを実行して実行すると、定義された効果が必要になります。問題は次のとおりです。(C ++標準では、POSIXではなく、OSドキュメントではありません...)定義されている効果です。 2切り離されたスレッドは結合できません(の意味でstd::thread::join())。デタッチされたスレッドからの結果を待つことはできますが(たとえば、からstd::packaged_task、またはカウントセマフォまたはフラグと条件変数によって)、それはスレッドが実行を完了したことを保証するものではありません。あなたがスレッドの最初の自動オブジェクトのデストラクタにシグナリング部分を入れない限り、確かに、そこになり、一般的には、その実行コード(デストラクタ)も後のシグナリングコード。OSがメインスレッドをスケジュールして結果を消費し、デタッチされたスレッドがデストラクタの実行を完了する前に終了する場合、^ Wisはどのように定義されますか?

6
なぜstd :: move an std :: shared_ptrなのでしょうか?
私はClangソースコードを調べていましたが、次のスニペットを見つけました。 void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = std::move(Value); } なぜ私がしたいでしょうか?std::movestd::shared_ptr 共有リソースの所有権を譲渡するポイントはありますか? なぜ私は代わりにこれをしないのですか? void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = Value; }

1
enumクラスにstatic_castの無効な値をキャストするとどうなりますか?
次のC ++ 11コードを考えてみます。 enum class Color : char { red = 0x1, yellow = 0x2 } // ... char *data = ReadFile(); Color color = static_cast<Color>(data[0]); data [0]が実際には100であると仮定します。標準に従って色は何に設定されていますか?特に、後で行う場合 switch (color) { // ... red and yellow cases omitted default: // handle error break; } 標準はデフォルトがヒットすることを保証しますか?そうでない場合、ここでエラーをチェックするための適切で最も効率的で最もエレガントな方法は何ですか? 編集: おまけとして、標準はこれについて何らかの保証をしていますが、明白な列挙型がありますか?
146 c++  c++11 


4
メンバー関数内のラムダキャプチャリストでメンバー変数を使用する
次のコードはgcc 4.5.1でコンパイルされますが、VS2010 SP1ではコンパイルされません。 #include <iostream> #include <vector> #include <map> #include <utility> #include <set> #include <algorithm> using namespace std; class puzzle { vector<vector<int>> grid; map<int,set<int>> groups; public: int member_function(); }; int puzzle::member_function() { int i; for_each(groups.cbegin(),groups.cend(),[grid,&i](pair<int,set<int>> group){ i++; cout<<i<<endl; }); } int main() { return 0; } これはエラーです: error C3480: 'puzzle::grid': …

12
unordered_setの代わりにsetを使用するのはなぜですか?
C ++ 0xは、他の多くの場所でunordered_set利用可能なものを導入していますboost。私が理解しているのunordered_setは、O(1)ルックアップが複雑なハッシュテーブルです。一方、ルックアップが複雑なsetツリーにすぎませんlog(n)。なぜ誰もがset代わりに使うのunordered_setでしょうか?すなわち、setもはや必要性はありますか?

1
C ++の「using」キーワードの背後にあるロジックは何ですか?
C ++の「using」キーワードの背後にあるロジックは何ですか? それはさまざまな状況で使用されており、それらすべてに共通点があるかどうかを探しています。「using」キーワードがそのように使用されている理由があります。 using namespace std; // to import namespace in the current namespace using T = int; // type alias using SuperClass::X; // using super class methods in derived class
145 c++  c++11 

7
C ++ autoキーワード。なぜそれは魔法なのですか?
私がC ++を学ぶために使用したすべての資料から、auto常に何の目的も果たさない奇妙なストレージ期間指定子でした。しかし、つい最近、それ自体を型名として使用するコードに遭遇しました。好奇心から私はそれを試しました、そしてそれは私がそれに偶然割り当てるもののタイプを想定しています! 突然、STLイテレータや、テンプレートを使用するものはすべて、10倍簡単に記述できます。Pythonのような「楽しい」言語を使用しているように感じます。 このキーワードは私の人生のどこにありましたか?それはビジュアルスタジオ専用であるか、ポータブルでないと言って、私の夢を打ち砕いてくれませんか?
144 c++  types  c++11  auto 

14
C ++でautoを使用して変数を宣言することの欠点はありますか?
これはauto、C ++ 11に追加されるかなり重要な機能であり、多くの新しい言語に従っているようです。Pythonのような言語と同様に、明示的な変数宣言はありません(Python標準を使用して可能かどうかはわかりません)。 auto変数を明示的に宣言する代わりにを使用して宣言することに欠点はありますか?

10
C ++ 11の関数の「最終」キーワードの目的は何ですか?
finalC ++ 11の関数のキーワードの目的は何ですか?派生クラスによる関数のオーバーライドを防ぐことは理解していますが、これが当てはまる場合は、final関数を非仮想として宣言するだけで十分ではないでしょうか?私がここで見逃している別のものはありますか?
143 c++  c++11  final 

14
C ++ 11の再帰的ラムダ関数
C ++ 11は初めてです。次の再帰的なラムダ関数を書いていますが、コンパイルできません。 sum.cpp #include <iostream> #include <functional> auto term = [](int a)->int { return a*a; }; auto next = [](int a)->int { return ++a; }; auto sum = [term,next,&sum](int a, int b)mutable ->int { if(a>b) return 0; else return term(a) + sum(next(a),b); }; int main(){ std::cout<<sum(1,10)<<std::endl; return 0; } …
143 c++  c++11  lambda 

4
値渡しはC ++ 11の妥当なデフォルトですか?
従来のC ++では、値による関数やメソッドへの受け渡しは、ラージオブジェクトの場合は遅く、一般に不満を抱きます。代わりに、C ++プログラマーは参照を渡す傾向がありますが、これは高速ですが、所有権、特にメモリ管理(オブジェクトがヒープに割り当てられている場合)に関するあらゆる種類の複雑な質問が生じます。 これで、C ++ 11には、Rvalue参照と移動コンストラクターがあります。つまりstd::vector、値を関数に渡したり、関数から渡したりするのが簡単な(のような)ラージオブジェクトを実装することができます。 では、これは、デフォルトでは、std::vectorやなどの型のインスタンスの値で渡す必要があることを意味しますstd::stringか?カスタムオブジェクトについてはどうですか?新しいベストプラクティスは何ですか?
142 c++  coding-style  c++11 

6
C ++ 11で「auto」を使用して推定されるときのラムダのタイプは何ですか?
ラムダの型は関数ポインターであるという認識がありました。以下のテストを行ったところ、間違っていることがわかりました(デモ)。 #define LAMBDA [] (int i) -> long { return 0; } int main () { long (*pFptr)(int) = LAMBDA; // ok auto pAuto = LAMBDA; // ok assert(typeid(pFptr) == typeid(pAuto)); // assertion fails ! } 上記のコードにポイントがありませんか?そうでない場合、キーワードでtypeof推定されるときのラムダ式は何autoですか?
141 c++  lambda  c++11  typeof  auto 

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