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

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

14
std :: exceptionから継承する必要がありますか?
少なくとも1つの信頼できるソース(私が採用したC ++クラス)で、C ++のアプリケーション固有の例外クラスがから継承することを推奨しているのを見てきましたstd::exception。このアプローチの利点ははっきりしません。 C#から継承する理由ApplicationExceptionは明らかです。便利なメソッド、プロパティ、コンストラクターをいくつか取得し、必要なものを追加またはオーバーライドするだけです。ではstd::exception、それあなたが得るすべてであると思わwhat()あなただけのようにも自分で作成することができオーバーライドする方法。 それではstd::exception、アプリケーション固有の例外クラスの基本クラスとして使用することにはどのような利点がありますか?継承しない理由はありますstd::exceptionか?

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

6
(方法)列挙型のアイテムを数えることはできますか?
このような疑問が浮かんだのは、 enum Folders {FA, FB, FC}; そして、各フォルダのコンテナの配列を作成したいと思いました: ContainerClass*m_containers[3]; .... m_containers[FA] = ...; // etc. (使い方はそれを使用するためにはるかにエレガントだマッピングされますstd::map<Folders, ContainerClass*> m_containers;) しかし、元の質問に戻ります。配列のサイズをハードコード化したくない場合、フォルダー内のアイテム数を把握する方法はありますか?(たとえばFC、リストの最後のアイテムであることに依存せずにContainerClass*m_containers[FC+1]、私が間違っていないようなものを許可します。)
98 c++  count  enumeration 

7
C ++警告:ゼロによるdoubleの除算
ケース1: #include <iostream> int main() { double d = 15.50; std::cout<<(d/0.0)<<std::endl; } 警告なしでコンパイルして出力しinfます。OK、C ++はゼロによる除算を処理できます(ライブでご覧ください)。 だが、 ケース2: #include <iostream> int main() { double d = 15.50; std::cout<<(d/0)<<std::endl; } コンパイラーは次の警告を出します(ライブで確認してください): warning: division by zero [-Wdiv-by-zero] std::cout<<(d/0)<<std::endl; 2番目のケースでコンパイラが警告を出すのはなぜですか? ですか0 != 0.0? 編集: #include <iostream> int main() { if(0 == 0.0) std::cout<<"Same"<<std::endl; else std::cout<<"Not …

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つの引数のみを取る非可変テンプレート関数があります。(大まかに)そのための構文規則は何ですか?どのように一般化できますか? また、関数の実装では、省略記号(...)は対象の式の最後にあります。テンプレート引数リストとパラメーターリストで省略記号が中央にある理由はありますか?

7
同じクラスのオブジェクトがお互いのプライベートデータにアクセスするのはなぜですか?
同じクラスのオブジェクトがお互いのプライベートデータにアクセスするのはなぜですか? class TrivialClass { public: TrivialClass(const std::string& data) : mData(data) {}; const std::string& getData(const TrivialClass& rhs) const { return rhs.mData; }; private: std::string mData; }; int main() { TrivialClass a("fish"); TrivialClass b("heads"); std::cout << "b via a = " << a.getData(b) << std::endl; return 0; } このコードは機能します。オブジェクトaがオブジェクトbのプライベートデータにアクセスして返すことは完全に可能です。なぜそうなのでしょうか?個人データは個人のものだと思います。(私はpimplイディオムのコピーコンストラクターを理解することから始めましたが、この単純な状況さえ理解していないことがわかりました。)

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、および配列に対するその優位性については言及しないでください。


5
[]を使用するときにC ++のマップタイプ引数に空のコンストラクターが必要なのはなぜですか?
C ++標準リストとdefault-constructible型も参照してください 大きな問題ではありません。特定の引数なしでクラスをインスタンス化したくないので、迷惑です。 #include <map> struct MyClass { MyClass(int t); }; int main() { std::map<int, MyClass> myMap; myMap[14] = MyClass(42); } これにより、次のg ++​​エラーが発生します。 /usr/include/c++/4.3/bits/stl_map.h:419:エラー:「MyClass()」の呼び出しに一致する関数がありません これは、デフォルトのコンストラクターを追加すると問題なくコンパイルされます。私はそれが間違った構文によって引き起こされたのではないと確信しています。
98 c++  dictionary 

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解決策により、注文に関係のない特定のメンバーを除外することができます この実装に考慮する必要がある欠点はありますか?

15
std :: stringからfloatまたはdouble
に変換しようとしstd::stringていfloat/doubleます。私は試した: std::string num = "0.6"; double temp = (double)atof(num.c_str()); ただし、常にゼロを返します。他の方法は?
98 c++ 


6
C ++の例外は本当に遅いですか
私はC ++での系統的エラー処理を見ていました。AndreiAlexandrescuは、C ++の例外は非常に遅いと主張しています。 これはC ++ 98でも同じですか?
98 c++ 

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