私は理解しようとしていますstd::reference_wrapper
。
次のコードは、参照ラッパーが参照とまったく同じように動作しないことを示しています。
#include <iostream>
#include <vector>
#include <functional>
int main()
{
std::vector<int> numbers = {1, 3, 0, -8, 5, 3, 1};
auto referenceWrapper = std::ref(numbers);
std::vector<int>& reference = numbers;
std::cout << reference[3] << std::endl;
std::cout << referenceWrapper.get()[3] << std::endl;
// I need to use get ^
// otherwise does not compile.
return 0;
}
私が正しく理解していれば、暗黙的な変換はメンバー関数の呼び出しには適用されません。これは固有の制限ですか? を頻繁に使用する必要がありstd::reference_wrapper::get
ますか?
別のケースは次のとおりです。
#include <iostream>
#include <functional>
int main()
{
int a = 3;
int b = 4;
auto refa = std::ref(a);
auto refb = std::ref(b);
if (refa < refb)
std::cout << "success" << std::endl;
return 0;
}
これは問題なく動作しますが、これをmain
定義の上に追加すると、次のようになります。
template <typename T>
bool operator < (T left, T right)
{
return left.someMember();
}
コンパイラはテンプレートのインスタンス化を試み、暗黙的な変換と組み込み演算子を忘れます。
この動作は固有のものですか、それとも について重要なことを誤解してい std::reference_wrapper
ますか?