gpt4 book ai didi

c++ - make_pair 和 pair 有什么区别?

转载 作者:行者123 更新时间:2023-11-30 03:23:42 29 4
gpt4 key购买 nike

如果你运行下面的代码,你将打印 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 有这条异常(exception)规则如下:

... unless application of std::decay results in std::reference_wrapper<X> for some type X, in which case the deduced type is X&.

总会有一份新的Callbacktest_vtor (无论是移动还是复制),这将在构建过程中超越其引用性。

关于c++ - make_pair 和 pair 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50211746/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com