gpt4 book ai didi

c++ - back_insert_iterator<> 按值传递安全吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:48:33 26 4
gpt4 key购买 nike

我有一个看起来像这样的代码:

struct Data { int value; };
class A {
public:
typedef std::deque<boost::shared_ptr<Data> > TList;
std::back_insert_iterator<TList> GetInserter()
{
return std::back_inserter(m_List);
}
private:
TList m_List;
};
class AA {
boost::scoped_ptr<A> m_a;
public:
AA() : m_a(new A()) {}
std::back_insert_iterator<A::TList> GetDataInserter()
{
return m_a->GetInserter();
}
};
class B {
template<class OutIt>
CopyInterestingDataTo(OutIt outIt)
{
// loop and check conditions for interesting data
// for every `it` in a Container<Data*>
// create a copy and store it
for( ... it = ..; .. ; ..) if (...) {
*outIt = OutIt::container_type::value_type(new Data(**it));
outIt++; // dummy
}
}
void func()
{
AA aa;
CopyInterestingDataTo(aa.GetDataInserter());
// aa.m_a->m_List is empty!
}
};

问题是 A::m_List 始终为空,即使在调用 CopyInterestingDataTo() 之后也是如此。但是,如果我调试并进入 CopyInterestingDataTo(),迭代器会存储假定插入的数据!

更新:我找到了罪魁祸首。我实际上有类似的东西:

class AA {
boost::scoped_ptr<A> m_a;
std::back_insert_iterator<A::TList> GetDataInserter()
{
//return m_a->GetInserter(); // wrong
return m_A->GetInserter(); // this is the one I actually want
}
// ..... somewhere at the end of the file
boost::scoped_ptr<A> m_A;
};

现在,我应该将哪个答案标记为答案?对于那些没有被选中的人真的很抱歉,但是你们肯定得到了一些赞成票:)

最佳答案

简短的回答是肯定的,back_insert_iterator 可以安全地按值传递。长答案:来自标准 24.4.2/3:

Insert iterators satisfy the requirements of output iterators.

和 24.1.2/1

A class or a built-in type X satisfies the requirements of an output iterator if X is an Assignable type (23.1) ...

最后是 23.1 中的表 64:

expression t = u return-type T& post-condition t is equivalent to u

编辑:乍一看您的代码对来说没问题,您是否 100% 确定确实插入了元素?如果你是,我会单步执行代码并检查 aa.m_a->m_List 对象的地址,并将其与 outIt 中存储的地址进行比较CopyInterestingDataTo,如果它们不一样,那就有问题了。

关于c++ - back_insert_iterator<> 按值传递安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2537130/

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