問題タブ [reference-wrapper]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - reference_wrapper の STL コンテナの初期サイズを設定するには?
でvector
ラップされたいくつかの参照型がありreference_wrapper
ます。このコンテナーを順不同で埋める必要があるため、コンテナーの初期サイズを設定しようとしています。
これは次のようなエラーでコンパイルに失敗します:
これを機能させるための回避策はありますか、vector<T*>
それともこの目的のために を使用する必要がありますか?
c++ - std::map で std::reference_wrapper を使用する
maps と reference_wrappers は簡単にできると思っていましたが、奇妙なことにつまずきました。
このコードでは、次のコンパイラ エラーが発生します。
ここで、私は本当に、本当に愚かなことをしているのでしょうか? この小さなコードがすぐに機能しないのはなぜですか?
c++ - 私のbad_allocはどこから来たのですか?
私はこのコードを持っています。タイプ scores
のフィールドですHiscoreTable
std::vector<reference_wrapper<Record>>
やろうとするとfor(reference_wrapper<Record> r : scores) cout << r.get() << endl;
、bad_alloc がスローされます。r
が aではなく aRecord&
であるためreference_wrapper<Record>
、a を割り当てることができないためRecord
ですか? そんなこと許してやり過ぎだと思っreference_wrapper<Record>::operator=
た?
編集:印刷ループが配置されていたデストラクタの問題であることがわかりました。ある時点で、値によって HiscoreTable をヘルパー関数に渡し、ヘルパー関数の最後で破棄されたときに、呼び出しサイトの HiscoreTable を無効にしました。印刷によって参照が壊れる理由はわかりませんが、それが起こったことだと思います。
c++ - MS Visual Studio 2013 の std::reference_wrapper
次のようなコードをコンパイルしようとしました:
しかし、なぜコンパイルされないのかわかりません。同じコードが MS Visual Studio 2012 で正常にコンパイルされたと確信していますが、Visual Studio 2013 では次のコンパイル エラーが報告されます。
クラスにコピー、移動、代入演算子を追加しようとしましたが、このエラーを取り除くことができませんでした。このエラーが参照している削除された機能を正確に知るにはどうすればよいですか?
c++ - std::reference_wrapper の問題
この問題は、次のコードで明確になります。
std::vector<int> a, b;
の代わりにコメントを使用するとint a = 0, b = 0;
、コードは GCC 5.1、clang 3.6、または MSVC'13 のいずれでもコンパイルされません。私の意見でstd::reference_wrapper<std::vector<int>>
は、 は LessThanComparable に暗黙的に変換可能std::vector<int>&
であるため、LessThanComparable 自体である必要があります。誰かが私にこれを説明できますか?
c++ - 標準コンテナーが非テンプレート Koenig 演算子の代わりに関数テンプレートを使用する理由
この質問は、 Issue with std::reference_wrapper に触発されています。たとえば、operator<
forとしましょうstd::vector
。関数テンプレートとして次のように定義されています
その結果、関数引数から対応する関数パラメーターの型への暗黙的な変換は拒否されます (基本的にはテンプレートの性質のため)。これにより、 の有用性と利便性が大幅に低下しstd::reference_wrapper
ます。たとえば、std::sort
onは使用できませんstd::vector<std::reference_wrapper<std::vector<int>>>
。
一方、すべての問題は、operator<
が次のような非テンプレート Koenig 演算子として定義されている場合にのみ解決されます。
なぜ標準ライブラリがこれではなく前者のアプローチを採用したのだろうか?
serialization - ブーストでクラスのシリアル化を抽象化するための reference_wrapper
抽象クラスの Boost ベクター (またはその他のコンテナー) でシリアル化する必要があります。抽象クラスのベクトルを直接作成することはできないため、この抽象クラスへの reference_wrapper のベクトルを作成しました。
しかし、Boost std::reference_wrapper で抽象クラスにシリアル化する方法は? 直接実行しようとすると、reference_wrapper のデフォルト コンストラクターにアクセスできないというエラーが表示されます。
前もって感謝します。