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

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*>

10-08 03:54