gpt4 book ai didi

c++ - STD 指向指针的迭代器;获取应该等效的代码的不同类型?

转载 作者:行者123 更新时间:2023-11-28 08:00:04 25 4
gpt4 key购买 nike

我正在尝试从迭代器获取一个常规指针,但是关于我获取的类型发生了一件非常奇怪的事情。我只会发布代码,我假设这两个片段彼此相等,但如果我错了请告诉我。导致片段的代码是:

CallbackTrigger trigger(triggerParameters);
std::set<CallbackTrigger> triggerSet;
auto result = triggerSet.insert(trigger);

片段A:

auto whatIGet = &(*result.first);  // whatIGet is type:
// "const std::allocator<CallbackTrigger>::value_type *"

片段 B:

auto arbitraryStep = *result.first; 
auto whatIWanted = &arbitraryStep; // this is type "CallbackTrigger*"

当我尝试将指针插入列表时,遇到这种差异并拒绝使用片段 A 进行编译的代码是

std::list<CallbackTrigger*> listing;
listing.push_back(whatIWanted); // compiles fine
listing.push_back(whatIGet); // error: "cannot convert parameter 1 from
// 'const CallbackTrigger* to 'CallbackTrigger *&&'"

这是怎么回事?

最佳答案

根据c++11标准:

template<class T> class allocator {
...
typedef T value_type;
...
};

因此const std::allocator<CallbackTrigger>::value_type *const CallbackTrigger*相同. set<CallbackTrigger> 的元素类型为 const CallbackTrigger ,所以当您尝试直接获取指向集合元素的指针时,这就是您得到的结果。

对于片段 B arbitraryStep将是 CallbackTrigger 类型, 自 *result.first将是 const CallbackTrigger并且 const 被丢弃以进行类型推导。因此&arbitraryStep类型为 CallbackTrigger* (注意缺少 const )。另请注意,whatIWanted是指向局部变量 ( arbitraryStep ) 的指针,而不是集合中的对象。因此使用它可能不会给你你想要的行为。

考虑到这一点,显然您需要将列表类型更改为 list<const CallbackTrigger*> .

关于c++ - STD 指向指针的迭代器;获取应该等效的代码的不同类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11711334/

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