std::ref/のページの例は、std::crefstd::ref /を使用して、参照によって引数を取得しているように見える方法でstd::cref引数を渡すことを示していますが、実際には値によってすべてを取得します。std::bindstd::bind
std::reference_wrapperその例だけを見ると、の存在について無知である可能性もありstd::ref、リンクされた例で示される動作を許可する関数にすぎません。
それが、質問のタイトルと以下のstd::ref作品の意味です。
ほとんどの楽しみのためにstd::ref、私は自分自身を実装しようとしましたが、これを思いつきました:
template<typename T>
struct ref_wrapper {
ref_wrapper(T& t) : ref(t) {}
T& ref;
operator T&() const {
return ref;
}
};
template<typename T>
ref_wrapper<T> ref(T& t) {
return ref_wrapper{t}; // Ooops
}
template<typename T>
ref_wrapper<const T> cref(const T& t) {
return ref_wrapper{t}; // Ooops
}
でコンパイルしていたため、誤ってCTAD// Ooopsを使用したとマークされた行のどこか。2 つのケースでとに変更することで、これが修正されます。-std=c++17ref_wrapperref_wrapper<T>ref_wrapper<const T>
それから私はのぞき見しました/usr/include/c++/10.2.0/bits/refwrap.h。
一方で、私の / の実装は/refの実装にcrefよく似ていることがわかります。std::refstd::cref
一方、std::reference_wrapper約60行の長さです。noexcept、マクロ、copy ctor、copyなどoperator=、たくさんのものがありますget。
std::reference_wrapper そのほとんどは をスレーブとしてのみstd::ref使用することには関係ないと思いますが、コンストラクターがユニバーサル参照を取るなど、関連する可能性があるものがあります。
だから私の質問は:私の細い試みに関して、働くstd::reference_wrapperために必要で十分な部分は何ですか?std::ref
std::reference_wrapper on cppreferenceの実装の可能性があることに気付きました(GCC のものよりノイズが少ない)。とはいえ、ここでも理由のわからないところがあり、 などoperator()。