我试图理解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
?