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

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


4
なぜコピーしてから移動するのですか?
誰かがオブジェクトをコピーし、その後それをクラスのデータメンバーに移動することにしたコードをどこかに見ました。これは、移動の全体のポイントがコピーを避けることであると思ったので、私を混乱させました。次に例を示します。 struct S { S(std::string str) : data(std::move(str)) {} }; ここに私の質問があります: 右辺値参照を使用しないのはなぜstrですか? 特に次のような場合、コピーは高価になりませんstd::stringか? 著者がコピーを作成して次に移動することを決定した理由は何ですか? いつ自分でこれを行うべきですか?

2
可変長テンプレートのコンテキストでの「…」トークンのルールは何ですか?
C ++ 11には、次のような可変テンプレートがあります。 template< class T, class... Args > unique_ptr<T> make_unique( Args&&... args ) { return unique_ptr<T>(new T(std::forward<Args>(args)...)); } このことについて、いくつかの好奇心があります。式は、std::forward<Args>(args)...両方を使用Argsし、args一つだけ...のトークン。さらにstd::forward、1つのテンプレートパラメーターと1つの引数のみを取る非可変テンプレート関数があります。(大まかに)そのための構文規則は何ですか?どのように一般化できますか? また、関数の実装では、省略記号(...)は対象の式の最後にあります。テンプレート引数リストとパラメーターリストで省略記号が中央にある理由はありますか?

6
コンストラクター初期化子でのメンバー配列の初期化
class C { public: C() : arr({1,2,3}) //doesn't compile {} /* C() : arr{1,2,3} //doesn't compile either {} */ private: int arr[3]; }; 理由は、配列は=構文でのみ初期化できるためです。つまり、 int arr[3] = {1,3,4}; ご質問 やりたいことを行うにはどうすればよいですか(つまり、コンストラクターで配列を初期化します(本体の要素を割り当てません))。それも可能ですか? C ++ 03標準は、ctor初期化子での集約(配列を含む)の初期化に関して特別なことを言っていますか?または、上記のコードの無効性は他のいくつかのルールの当然の結果ですか? C ++ 0x初期化リストは問題を解決しますか? PS私がよく知っているベクトル、boost :: array、および配列に対するその優位性については言及しないでください。

13
c ++ 11のシーケンスzip関数?
新しい範囲ベースのforループを使用すると、次のようなコードを記述できます for(auto x: Y) {} どのIMOが(例)からの大きな改善です for(std::vector<int>::iterator x=Y.begin(); x!=Y.end(); ++x) {} Python zip関数のように、2つの同時ループをループするために使用できますか?Pythonに慣れていない人のために、コード: Y1 = [1,2,3] Y2 = [4,5,6,7] for x1,x2 in zip(Y1,Y2): print x1,x2 出力として与える (1,4) (2,5) (3,6)
98 c++  c++11  sequences 

4
std :: functionはどのように実装されていますか?
私が見つけたソースによると、ラムダ式は基本的に、オーバーロードされた関数呼び出し演算子と参照される変数をメンバーとして持つクラスを作成するコンパイラーによって実装されます。これはラムダ式のサイズが変化することを示唆しており、サイズが任意に大きくなることができる十分な参照変数が与えられます。 アンはstd::function持つべき一定の大きさを、同じ種類のいずれかのラムダを含む、呼び出し可能オブジェクトの任意の種類を、包むことができなければなりません。どのように実装されていますか?場合はstd::function、内部では、その標的にポインタを使用し、そして何が起こるか、ときstd::functionインスタンスがコピーまたは移動されましたか?関連するヒープ割り当てはありますか?
98 c++  c++11  lambda 

4
「タプル」と「タイ」を介して比較演算子を実装することは良い考えですか?
(注:tupleおよびtieBoostまたはC ++ 11から取得できます。)厳密な弱い順序付けのように、すべての重要なものがそのデータ型に対してすでに行われているため 、2つの要素のみを含む小さな構造体を書き込むときstd::pair、operator<。 ただし、欠点は、ほとんど役に立たない変数名です。私がそれを作成したtypedefとしても、特に両方が同じタイプである場合は特に、2日後に何が何firstであったかsecond正確には覚えていません。これは、3つ以上のメンバーの場合はさらに悪化します。これは、入れ子にするpairことでほとんど問題になります。 そのための他のオプションはtuple、BoostまたはC ++ 11のいずれかからですが、実際には見た目が良く、明確ではありません。そこで、必要な比較演算子を含め、自分で構造体を書くことに戻ります。 特にはoperator<非常に扱いにくい場合があるので、次のように定義された操作に依存するだけで、この混乱全体を回避することを考えましたtuple。 の例operator<、例えば厳密な弱い順序付け: bool operator<(MyStruct const& lhs, MyStruct const& rhs){ return std::tie(lhs.one_member, lhs.another, lhs.yet_more) < std::tie(rhs.one_member, rhs.another, rhs.yet_more); } (tieは、渡された引数からtupleのT&参照を作成します。) 編集:@DeadMGからプライベートに継承するという提案tupleは悪いことではありませんが、かなりの欠点がありました。 事業者が独立している場合(おそらく友人)、私は公に継承する必要があります キャストを使用すると、関数/演算子(operator=特に)を簡単にバイパスできます tie解決策により、注文に関係のない特定のメンバーを除外することができます この実装に考慮する必要がある欠点はありますか?

12
C ++ 11で 'for'ループの範囲にあるときに、アイテムをベクトルから削除しますか?
私はIInventory *のベクトルを持っていて、C ++ 11の範囲を使用してリストをループし、それぞれを処理しています。 1つでいくつかのことを行った後、それをリストから削除して、オブジェクトを削除することができます。deleteいつでもポインターを呼び出してクリーンアップできることはわかっていますが、範囲forループ内にあるときに、ポインターをベクターから削除する適切な方法は何ですか?リストから削除すると、ループが無効になりますか? std::vector<IInventory*> inv; inv.push_back(new Foo()); inv.push_back(new Bar()); for (IInventory* index : inv) { // Do some stuff // OK, I decided I need to remove this object from 'inv'... }
97 c++  vector  for-loop  c++11 

4
std :: system_clockとstd :: steady_clockの違いは?
違いは何であるstd::system_clockとはstd::steady_clock?(異なる結果/動作を示す例のケースは素晴らしいでしょう)。 私の目標が関数の実行時間を正確に測定することである場合(ベンチマークなど)std::system_clock、std::steady_clockとの間の最良の選択はstd::high_resolution_clock何ですか?
97 c++  c++11  timer  chrono 

3
C ++ 17、C ++ 14、およびC ++ 11オブジェクトをリンクしても安全ですか
3つのコンパイル済みオブジェクトがあり、すべて同じコンパイラ/バージョンで生成されているとします。 AはC ++ 11標準でコンパイルされました BはC ++ 14標準でコンパイルされました CはC ++ 17標準でコンパイルされました 簡単にするために、すべてのヘッダーがC ++ 11で記述されており、3つの標準バージョン間でセマンティクスが変更されていない構成体のみを使用しているため、相互依存関係がヘッダーインクルードで正しく表現され、コンパイラーが異議を唱えなかったとします。 これらのオブジェクトのどの組み合わせがそれであり、単一のバイナリにリンクするのは安全ではありませんか?どうして? 編集:主要なコンパイラ(gcc、clang、vs ++など)に関する回答を歓迎します
97 c++  c++11  linker  c++14  abi 

3
概念とテンプレート制約の違いは何ですか?
C ++の完全な概念の提案とテンプレートの制約(たとえば、Dlangに表示される制約やC ++ 1yの新しいconcepts-liteの提案)の意味上の違いは何ですか? テンプレートの制約ができないよりも、本格的なコンセプトは何ができるのですか?
96 c++  c++11  d  c++-concepts 

3
なぜstd :: stouがないのですか?
C ++ 11はいくつかの新しい文字列変換関数を追加しました: http://en.cppreference.com/w/cpp/string/basic_string/stoul これには、stoi(文字列からint)、stol(文字列からlong)、stoll(文字列からlong long)、stoul(文字列からunsigned long)、stoull(文字列からunsigned long long)が含まれます。その不在で注目すべきは、stou(文字列から符号なし)関数です。それが必要ではないが、他のすべてが必要な理由はありますか? 関連:C ++ 11には「sto {short、unsigned short}」関数はありませんか?
96 c++  string  c++11  std 

8
initializer_listおよび移動セマンティクス
から要素を移動することはできstd::initializer_list<T>ますか? #include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // kosher? } } 以来std::intializer_list<T>、特別なコンパイラの注意を必要とし、C ++標準ライブラリの通常のコンテナのような値のセマンティクスを持っていない、私はむしろ後悔するより安全であると聞いて思います。

1
委任コンストラクターの使用中のメンバーの初期化
私はC ++ 11標準を試し始めましたが、同じクラスの別のctorからctorを呼び出してinitメソッドなどを回避する方法を説明するこの質問を見つけました。今、私は次のようなコードで同じことを試しています: hpp: class Tokenizer { public: Tokenizer(); Tokenizer(std::stringstream *lines); virtual ~Tokenizer() {}; private: std::stringstream *lines; }; cpp: Tokenizer::Tokenizer() : expected('=') { } Tokenizer::Tokenizer(std::stringstream *lines) : Tokenizer(), lines(lines) { } しかし、これは私にエラーを与えています: In constructor ‘config::Tokenizer::Tokenizer(std::stringstream*)’: /path/Tokenizer.cpp:14:20: error: mem-initializer for ‘config::Tokenizer::lines’ follows constructor delegationTokenizer()の部分をリストの最初と最後に移動しようとしましたが、それは役に立ちませんでした。 これの背後にある理由は何ですか、どうすれば修正できますか?代わりにをlines(lines)体に移動してみましたが、this->lines = lines;正常に動作します。しかし、私は本当に初期化リストを使用できるようにしたいと思います。

6
不明なサイズのstd :: arrayを関数に渡す
C ++ 11では、既知の型でサイズが不明なstd :: arrayを受け取る関数(またはメソッド)をどのように記述すればよいでしょうか? // made up example void mulArray(std::array<int, ?>& arr, const int multiplier) { for(auto& e : arr) { e *= multiplier; } } // lets imagine these being full of numbers std::array<int, 17> arr1; std::array<int, 6> arr2; std::array<int, 95> arr3; mulArray(arr1, 3); mulArray(arr2, 5); mulArray(arr3, 2); …
96 c++  c++11  stdarray 

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