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

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

8
noexceptを実際に使用する必要があるのはいつですか?
noexceptキーワードが適切に多くの関数のシグネチャに適用することができますが、私は実際にそれを使用することを検討すべきときになどわからないと思います。これまでに読んだ内容に基づくと、のぎりぎりの追加はnoexcept、ムーブコンストラクターがスローするときに発生するいくつかの重要な問題に対処しているようです。ただし、noexceptそもそも詳細について読むためのいくつかの実際的な質問に対しては、まだ満足のいく答えを提供することはできません。 私がスローしないとわかっている関数の例はたくさんありますが、コンパイラーがそれ自体で決定することはできません。このような場合noexceptはすべて関数宣言に追加する必要がありますか? すべての関数宣言のnoexcept後に追加する必要があるかどうかを考える必要があると、プログラマーの生産性が大幅に低下します(率直に言って、お尻の痛みになります)。どのような状況での使用についてより注意する必要がありますか。また、どのような状況で暗黙の状況を回避できますか?noexceptnoexcept(false) 使用後にパフォーマンスの改善が見られるのはいつ現実的に期待できnoexceptますか?特に、C ++コンパイラーがを追加した後でより優れたマシンコードを生成できるコードの例を示しますnoexcept。 個人的には、noexcept特定の種類の最適化を安全に適用するためにコンパイラーに提供される自由の増加のために気にしています。最近のコンパイラnoexceptはこのように利用していますか?そうでない場合、近いうちにそうすることを期待できますか?

6
フォワードを使用する利点
完全な転送でstd::forwardは、名前付き右辺値参照t1および名前なし右辺値参照への変換に使用されt2ます。それを行う目的は何ですか?&を左辺値のinnerままにすると、呼び出された関数にどのような影響がありますか?t1t2 template <typename T1, typename T2> void outer(T1&& t1, T2&& t2) { inner(std::forward<T1>(t1), std::forward<T2>(t2)); }

6
C ++ 11右辺値と移動の意味論の混乱(returnステートメント)
私は右辺値参照を理解し、C ++ 11のセマンティクスを移動しようとしています。 これらの例の違いは何ですか?それらのうちどれがベクターコピーを行わないでしょうか? 最初の例 std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&rval_ref = return_vector(); 2番目の例 std::vector<int>&& return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector(); 3番目の例 std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();


6
unique_ptr引数をコンストラクタまたは関数に渡すにはどうすればよいですか?
C ++ 11でセマンティクスを移動するのは初めてですがunique_ptr、コンストラクターまたは関数でパラメーターを処理する方法がよくわかりません。このクラスが自分自身を参照していると考えてください。 #include <memory> class Base { public: typedef unique_ptr<Base> UPtr; Base(){} Base(Base::UPtr n):next(std::move(n)){} virtual ~Base(){} void setNext(Base::UPtr n) { next = std::move(n); } protected : Base::UPtr next; }; これは私がunique_ptr引数を取る関数をどのように書くべきですか? そしてstd::move、呼び出しコードで使用する必要がありますか? Base::UPtr b1; Base::UPtr b2(new Base()); b1->setNext(b2); //should I write b1->setNext(std::move(b2)); instead?


10
Pretty-print C ++ STLコンテナ
この投稿の最後にある更新に注意してください。 更新:このライブラリ用にGitHubで公開プロジェクトを作成しました! 私は、すべてのSTLコンテナーをを介してきれいに印刷することをすべて一度に処理する単一のテンプレートが欲しいと思いoperator<<ます。疑似コードで、私はこのようなものを探しています: template<container C, class T, String delim = ", ", String open = "[", String close = "]"> std::ostream & operator<<(std::ostream & o, const C<T> & x) { o << open; // for (typename C::const_iterator i = x.begin(); i != x.end(); i++) /* Old-school */ for (auto i …

9
std :: promiseとは何ですか?
私はC ++ 11にかなり精通していますstd::thread、std::asyncとstd::futureの構成要素(例えば参照この回答)ストレートフォワードです。 でも、なんだかよくわからない std::promise、何をする、どのような状況で最適に使用されるは。標準のドキュメント自体には、クラスの概要以外の多くの情報は含まれていません。また、単に:: threadも含まれていません。 誰かstd::promiseが必要であり、それが最も慣用的な解決策である状況の簡潔で簡潔な例を誰かに教えてもらえますか?

1
C ++テンプレートtypedef
クラスがあります template<size_t N, size_t M> class Matrix { // .... }; サイズNおよび1のa と同等の(列ベクトル)typedefを作成するa を作成します。そのようなもの:VectorMatrix typedef Matrix<N,1> Vector<N>; コンパイルエラーが発生します。以下は似たようなものを作成しますが、正確には私が望んでいるものではありません。 template <size_t N> class Vector: public Matrix<N,1> { }; 解決策またはそれほど高価ではない回避策/それに対するベストプラクティスはありますか?
369 c++  templates  c++11  typedef 

5
関数からunique_ptrを返す
unique_ptr<T>コピーの構築を許可せず、代わりに移動のセマンティクスをサポートします。それでも、unique_ptr<T>関数からを返し、戻り値を変数に割り当てることができます。 #include <iostream> #include <memory> using namespace std; unique_ptr<int> foo() { unique_ptr<int> p( new int(10) ); return p; // 1 //return move( p ); // 2 } int main() { unique_ptr<int> p = foo(); cout << *p << endl; return 0; } 上記のコードはコンパイルされ、意図したとおりに機能します。では、この行1がコピーコンストラクタを呼び出さず、コンパイラエラーが発生するのはなぜですか。2代わりにlineを使用しなければならなかった場合、それは理にかなっています(lineを使用し2ても機能しますが、そうする必要はありません)。 私はC ++ 0xがこの例外を許可していることを知っています。unique_ptr戻り値は関数が終了するとすぐに破棄され、返されるポインターの一意性を保証する一時的なオブジェクトだからです。これがどのように実装されているのか知りたいのですが、コンパイラーで特別なケースになっているのでしょうか、それとも、これが利用する言語仕様に他の節があるのでしょうか?
367 c++  c++11  unique-ptr 

5
C ++ 11をg ++でコンパイルする
C ++コンパイラをC ++ 11に更新しようとしています。少し検索して、フラグ-std=c++0xまたはを使用する必要があるという結論に達しましたが、フラグ-std=gnu++0xについて多くのことを知りません。誰か助けてもらえますか?(私はUbuntu 12.04を使用しています。) これは、C ++ 11に含まれているライブラリ(つまり、配列)を使用しようとするとコンパイラーから発生するエラーです。 #include <array> #include <iostream> int main() { std::array<int, 3> arr = {2, 3, 5}; ... } このファイルには、今後のISO C ++標準であるC ++ 0xのコンパイラとライブラリのサポートが必要です。このサポートは現在実験段階であり、-std = c ++ 0xまたは-std = gnu ++ 0xコンパイラオプションで有効にする必要があります。
367 c++  c++11  g++  flags 

14
CMakeでC ++ 11をアクティブ化するにはどうすればよいですか?
CMakeで生成されたmakefileを実行してプログラムをコンパイルしようとすると、次のエラーが発生します。 範囲ベースのforループは、C ++ 98モードではサポートされていません。 にを追加add_definitions(-std=c++0x)してみましたがCMakeLists.txt、効果がありませんでした。 私もこれを試しました: if(CMAKE_COMPILER_IS_GNUCXX) add_definitions(-std=gnu++0x) endif() 私がするときg++ --version、私は得ます: g ++(Ubuntu / Linaro 4.6.1-9ubuntu3)4.6.1 私も試しましたがSET(CMAKE_CXX_FLAGS "-std=c++0x")、これも機能しません。 CMakeを使用してC ++ 11の機能をアクティブ化する方法がわかりません。
356 c++11  cmake 

6
std :: unique_lock <std :: mutex>またはstd :: lock_guard <std :: mutex>?
StackаэтотвопросестьответынаStack Overflowнарусском:Чемstd :: unique_lockотличаетсяотstd :: lock_guard? 2つの使用例があります。 A. 2つのスレッドによるアクセスをキューに同期させたい。 B. 2つのスレッドによるキューへのアクセスを同期し、条件変数を使用したいのは、一方のスレッドが、もう一方のスレッドによってコンテンツがキューに格納されるのを待つためです。 ユースケースAIについては、を使用しstd::lock_guard&lt;&gt;たコード例を参照してください。使用例については、BIを使用したコード例を参照してくださいstd::unique_lock&lt;&gt;。 この2つの違いと、どのユースケースでどちらを使用すればよいのですか?

14
C ++ 11でconstexpr機能を使用する必要があるのはいつですか?
「常に5を返す関数」を持つことは、「関数を呼び出す」という意味を壊したり弱めたりしているように思えます。理由があるか、この機能が必要であるか、C ++ 11にはないでしょう。なぜそこにあるのですか? // preprocessor. #define MEANING_OF_LIFE 42 // constants: const int MeaningOfLife = 42; // constexpr-function: constexpr int MeaningOfLife () { return 42; } 私がリテラル値を返す関数を書いて、コードレビューにたどり着いたら、誰かが私に言ったので、return 5を書く代わりに定数値を宣言する必要があります。
337 c++  c++11  constexpr 

5
std :: mapで範囲ベースのfor()ループを使用する方法
C ++ 11の範囲ベースのfor()ループの一般的な例は、常に次のような単純なものです。 std::vector&lt;int&gt; numbers = { 1, 2, 3, 4, 5, 6, 7 }; for ( auto xyz : numbers ) { std::cout &lt;&lt; xyz &lt;&lt; std::endl; } その場合xyzはintです。しかし、マップのようなものがあるとどうなりますか?この例の変数のタイプは何ですか? std::map&lt; foo, bar &gt; testing = { /*...blah...*/ }; for ( auto abc : testing ) { std::cout &lt;&lt; abc …

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