std::ref
/のページの例は、std::cref
std::ref
/を使用して、参照によって引数を取得しているように見える方法でstd::cref
引数を渡すことを示していますが、実際には値によってすべてを取得します。std::bind
std::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++17
ref_wrapper
ref_wrapper<T>
ref_wrapper<const T>
それから私はのぞき見しました/usr/include/c++/10.2.0/bits/refwrap.h
。
一方で、私の / の実装は/ref
の実装にcref
よく似ていることがわかります。std::ref
std::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()
。