我正在尝试从迭代器中获取常规指针,但是关于所获取的类型,确实发生了一件非常奇怪的事情。我将发布代码,假设这两个代码段彼此相等,但是请告诉我我是否错了。导致这些代码段的代码是:
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*>
。