如果你运行下面的代码,你将打印3412,这意味着std::make_pair
在这里忽略了std::ref
。我想了解这里发生了什么?
using Callback = std::function<void ()>;
struct Test
{
void operator()()
{
std::cout << a ;
};
int a;
};
struct Sub
{
void Subscribe(Callback callback)
{
callback_ = callback;
}
void trigger()
{
callback_();
}
Callback callback_;
};
int main() {
std::vector<std::pair<Callback, int>> test_vtor;
std::unordered_map<int, Test > test_map;
test_map[1].a = 1;
test_map[2].a = 2;
test_vtor.push_back(std::pair<Callback, int>(std::ref(test_map[1]), 1));
test_vtor.push_back(std::pair<Callback, int>(std::ref(test_map[2]), 2));
test_vtor.push_back(std::make_pair(std::ref(test_map[1]), 1));
test_vtor.push_back(std::make_pair(std::ref(test_map[2]), 2));
test_map[1].a = 3;
test_map[2].a = 4;
std::for_each(test_vtor.begin(),
test_vtor.end(),
[&](auto& pair){
pair.first();
});
}
所以在from this answer上,std::ref
不能与test_vtor
合作如下:
std::vector<std::pair<Callback, int>> test_vtor;
即使您传递参考:
test_vtor.push_back(std::make_pair(std::ref(test_map[1]), 1));
你不能避免你的Callback
被复制。这与宣布std::pair<Callback&, int>
不被允许的原因相同。
即使std::make_pair
对std::reference_wrapper
有如下特殊规则,如下:
...除非应用std :: decay导致某些类型
std::reference_wrapper<X>
的X
,在这种情况下推导出的类型是X&
。
Callback
总会有一份test_vtor
的新副本(无论是移动还是复制),在施工期间将超过其参考资料。