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

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

4
テンプレートメタプログラミング
誰かが最初のテンプレートのメタプログラミング方法が無限ループになる理由を私に説明できますが、2番目の方法は正しく実行されます。 #include <iostream> using namespace std; template<int N, int M> struct commondivs { static const int val = (N<M) ? commondivs<N,(M-N)>::val : commondivs<(N-M),M>::val; }; template<int N> struct commondivs<N,N> { static const int val = N; }; int commondiv(int N, int M){ if(N==M){ return N; } return (N<M)?commondiv(N,(M-N)):commondiv((N-M),M); } int main() …

2
関数でremove_referenceが機能しないのはなぜですか?
先日、テンプレートのメタプログラミングを行っているときに、奇妙なことに遭遇しました。それは基本的にこの主張に帰着します(私が期待するとおり)通過しません。 static_assert(std::is_same_v<void(), std::remove_reference_t<void()&>>); 最初は、関数参照を定義する構文上の間違いを犯していると思っていましたが、このアサーションは成功し、そうではないことがわかりました。 static_assert(std::is_same_v<void()&, void()&>); またremove_reference、cppreferenceからソースをコピーして自分で実装しようとしましたが、それも機能しませんでした。ここで何が起こっているのですか?
38 c++  templates  types  c++17 



4
テンプレートを使用した関数のオーバーロード
テンプレートを使用して関数を定義しようとしています。型名をintまたはanEnum(定義した特定の列挙型)にしたいのですが。私は以下を試しましたが失敗しました: template <int | anEnum T> // or <int T, anEnum T> or <int, anEnum T> bool isFunction(const T &aVariable){} 私がやろうとしていることは、2つのオーバーロードされた関数を定義する代わりに、テンプレートを使用することです。プログラマがタイプを考慮する必要なしに、次のように関数を呼び出す方がいいです isFunction(aVariable) // and not isFunction<int> (aVariable) nor isFunction<anEnum> (aVariable) 基本的に、この関数をintおよびaNumタイプ用にテンプレート化します。私はこれを検索しましたが、答えが見つかりませんでした。何が欠けているのでしょうか?ありがとうございました、

3
サイズ0の動的配列へのポインタの増分は未定義ですか?
AFAIK、ただし、サイズが0の静的メモリ配列を作成することはできませんが、動的配列を使用して作成できます。 int a[0]{}; // Compile-time error int* p = new int[0]; // Is well-defined 私が読んだpように、1つの最後の要素のように動作します。p指すアドレスを印刷できます。 if(p) cout << p << endl; イテレータ(最後の要素)ではできないので、そのポインタ(最後の要素)を逆参照できないことは確かですが、そのポインタをインクリメントするかどうかはわかりませんp。イテレータのような未定義の動作(UB)ですか? p++; // UB?

2
コピーコンストラクターでのC ++名前空間の競合
私は次のコードを持っています: namespace A { struct Foo { int a; }; } struct Foo { int b; }; struct Bar : public A::Foo { Bar(Foo foo) { c = foo.b; } int c; }; A :: Fooにはbという名前のメンバーがないため、C ++コンパイラーは「c = foo.b」で不平を言います。:: FooでBarパラメータのタイプを変更すると、機能します。 私の質問は、この動作の背後にある合理的なものは何ですか(私はそれが継承によってBarがA名前空間に入るようにするという事実に関係していると思いますが、この理論をサポートするドキュメントを見つけることができません。

2
関数へのポインタを新しく割り当てることは合法ですか?
関数へのポインターはvoid *ポインターに格納できないため、単純なデータポインターではありません。それにもかかわらず、以下のコードのように、関数ポインターのコピーを動的メモリ(gccとclang内)に保存できるようです。そのようなコードはC ++標準に従って合法ですか、またはこれはある種のコンパイラ拡張ですか? さらに、結果の関数ポインターへのポインターはプレーンデータポインターとして動作します。私はそれをvoid *に格納し、static_castによってvoid *から取得できます。この動作は規格によって保証されていますか? int main() { extern void fcn(); void (*fcnPtr)() = &fcn; void (**ptrToFcnPtr)() = nullptr; //Make the copy of fcnPtr on the heap: ptrToFcnPtr = new decltype(fcnPtr)(fcnPtr); //Call the pointed-to function : (**ptrToFcnPtr)(); //Save the pointer in void* : void *ptr = ptrToFcnPtr; //retrieve the …
33 c++ 

3
C ++ decltypeと括弧-なぜですか?
主題は以前に議論されました が、これは重複ではありません。 decltype(a)との違いについて質問された場合decltype((a))、通常の答えは- aは変数で(a)あり、は式です。私はこの答えに満足できないと思います。 まず、a表現もです。一次式のオプションには、特に- (式) id式 さらに重要なことに、decltypeの表現では、括弧が非常に明示的に考慮されます。 For an expression e, the type denoted by decltype(e) is defined as follows: (1.1) if e is an unparenthesized id-expression naming a structured binding, ... (1.2) otherwise, if e is an unparenthesized id-expression naming a non-type template-parameter, ... (1.3) otherwise, if e …

4
2つのusing句が同じ型に解決されるのはなぜgccではあいまいと見なされるのですか
using句を含む2つの基本クラスがあります class MultiCmdQueueCallback { using NetworkPacket = Networking::NetworkPacket; .... } class PlcMsgFactoryImplCallback { using NetworkPacket = Networking::NetworkPacket; .... } 次にクラスを宣言します class PlcNetwork : public RouterCallback, public PlcMsgFactoryImplCallback, public MultiCmdQueueCallback { private: void sendNetworkPacket(const NetworkPacket &pdu); } その後、コンパイラーは、「NetworkPacket」へのエラー参照にあいまいな「sendNetworkPacket(NetworkPacket&...」というフラグを立てます。 これで、両方の「using句」が同じ基本クラスNetworking:NetworkPacketに解決されます 実際、メソッド宣言を次のように置き換えた場合: void sendNetworkPacket(const Networking::NetworkPacket &pdu); それはうまくコンパイルします。 コンパイラーがそれぞれのusing節を両方とも同じ基本型を指しているにもかかわらず、異なる型として扱うのはなぜですか?これは標準によって義務付けられていますか、それともコンパイラのバグがありますか?

2
std :: vectorに追加するときのクラスフィールドの奇妙な動作
次の状況で、(clangおよびGCCで)非常に奇妙な動作が見つかりました。nodesクラスのインスタンスである1つの要素を持つベクトルがありますNode。次に、ベクターにnodes[0]新しい関数を追加する関数を呼び出しますNode。新しいノードが追加されると、呼び出し元オブジェクトのフィールドがリセットされます!ただし、関数が終了すると、通常の状態に戻ります。 これは最小限の再現可能な例だと思います: #include <iostream> #include <vector> using namespace std; struct Node; vector<Node> nodes; struct Node{ int X; void set(){ X = 3; cout << "Before, X = " << X << endl; nodes.push_back(Node()); cout << "After, X = " << X << endl; } }; int main() { nodes = …


6
std :: vector :: swapメソッドを使用して、C ++で2つの異なるベクトルを交換しても安全ですか?
次のコードがあるとします。 #include <iostream> #include <string> #include <vector> int main() { std::vector<std::string> First{"example", "second" , "C++" , "Hello world" }; std::vector<std::string> Second{"Hello"}; First.swap(Second); for(auto a : Second) std::cout << a << "\n"; return 0; } ベクトルがでなくstd::string、クラスであると想像してください。 std::vector<Widget> WidgetVector; std::vector<Widget2> Widget2Vector; 2つのベクトルをstd::vector::swapメソッドで交換しても安全WidgetVector.swap(Widget2Vector);ですか?それともUBにつながりますか?
30 c++  c++11  vector  stdvector  swap 

4
CおよびC ++で呼び出される(…)は何ですか?
の用途の1つは、CおよびC ++の可変個のエンティティ...を示すことです。 それの名前は何? そのように使用すると、演算子または何か他のものとして分類されますか? に関するその他の詳細...? 編集: 私はの目的を知ってい...ます。私はその名前と分類について質問しています。これは、CとC ++の両方で類似していると思います。

4
初期化されていないメンバーを持つ構造体をコピーする
一部のメンバーが初期化されていない構造体をコピーすることは有効ですか? 未定義の動作ではないかと思いますが、その場合、初期化されていないメンバーを構造体に残すと(それらのメンバーが直接使用されない場合でも)、非常に危険になります。だから、規格にそれを許すものがあるのか​​しら。 たとえば、これは有効ですか? struct Data { int a, b; }; int main() { Data data; data.a = 5; Data data2 = data; }

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