make_pair和pair之间有什么不同?

问题描述 投票:1回答:1

如果你运行下面的代码,你将打印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(); 
                });
}
c++
1个回答
2
投票

所以在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_pairstd::reference_wrapper有如下特殊规则,如下:

...除非应用std :: decay导致某些类型std::reference_wrapper<X>X,在这种情况下推导出的类型是X&

Callback总会有一份test_vtor的新副本(无论是移动还是复制),在施工期间将超过其参考资料。

© www.soinside.com 2019 - 2024. All rights reserved.