0

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

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

片段一:

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 *&&'"

这里发生了什么?

4

2 回答 2

1

根据c++11标准:

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

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

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

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

于 2012-07-29T17:51:22.230 回答
0

您不能通过std::set非常量别名访问 a 的内容。您可能发现的任何实现此目的的方法都只是标准库实现中的一个错误,并且对其进行变异可能会导致未定义的行为。

您的whatIWant别名甚至不在 中set,而是在您在堆栈上制作的副本中。

于 2012-07-29T17:48:47.673 回答