【发布时间】:2015-09-07 15:08:12
【问题描述】:
我在使用 for_each() 并在每个元素上调用构造函数/析构函数时遇到问题。
作为参考,mBegin 指向数组的开头,mEnd 超出最后一个元素,mCapacity 指向分配内存的结尾。
template <typename T>
void IDMapTree<T>::Grow()
{
const size_t prevSize = mCapacity - mBegin;
const size_t newSize = prevSize != 0 ? static_cast<size_t>(1.5f * prevSize) : 1;
T* newBuffer = static_cast<T*>(mAllocator.Allocate(newSize));
// initialize new buffer elements with copy constructor using old elements
uint32_t itemIndex = 0;
std::for_each(newBuffer, newBuffer + prevSize, [&](T& item) { item.T(*(mBegin + itemIndex++)); });
// destruct all old elements
std::for_each(mBegin, mEnd, [](T& item) { item.~T(); });
// ...
}
这段编译得很好:
std::for_each(mBegin, mEnd, [](T& item) { item.~T(); });
但这不是:
std::for_each(newBuffer, newBuffer + prevSize, [&](T& item) { item.T(*(mBegin + itemIndex++)); });
即使我像这样使用默认构造函数也不行:
std::for_each(newBuffer, newBuffer + prevSize, [](T& item) { item.T(); });
编译器 (VS2013) 说明如下:
error C2039: '__this' : is not a member of 'JonsEngine::SceneNode'
error C2039: 'T' : is not a member of 'JonsEngine::SceneNode'
在这种情况下,T 的类型为 JonsEngine::SceneNode。
这里有什么问题?为什么T() 不解析为SceneNode()?为什么析构函数有效,构造函数无效?
【问题讨论】:
-
您正在尝试调用已存在对象的构造函数? o.0
-
为什么要显式调用析构函数?您是否使用placement new 构建了元素?
-
只使用
std::vector作为存储空间。 -
使用placement new 是的,为什么不能使用for_each 来调用析构函数?
-
出于此问题范围之外的原因,我不能只使用向量。如果陈述有误,请详细说明?