c++ - std::for_each() 和调用构造函数/析构函数

标签 c++ c++11 stl

我在使用 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'

在这种情况下,TJonsEngine::SceneNode 类型。

这里有什么问题?为什么 T() 不解析为 SceneNode()?为什么析构函数起作用而构造函数不起作用?

最佳答案

您可以使用 std::uninitialized_copy()为此。

关于c++ - std::for_each() 和调用构造函数/析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32441706/

相关文章:

c++ - 根据输入数据创建 STL Vector - 标量或复杂类型

c++ - 不同数字类型的相同比较

c++ - decltype 返回的模板推导/替换错误

c++ - 如何在子类和父类的 header 中指定构造函数

c++ - 递归模板?

c++ - 将空终止的 const char* 字符串数组转换为 std::vector< std::string >

c# - 使用 char** 调用 cdecl 约定

c++ - safe bool idiom bool_type(和safe bool idiom)是如何工作的?

c++ - API函数可以初始化const全局变量吗?

c++ - C++ 中 T* 类型上 std::move 的意外行为