gpt4 book ai didi

c++ - 在 C++ 中构造数组元素在循环中调用 new 而不是 new[] 是否合法?

转载 作者:太空宇宙 更新时间:2023-11-04 12:31:10 24 4
gpt4 key购买 nike

我正在用 C++ 编写数组包装器(如 std::array)。动机是使 array-wrapper 成为接口(interface)的衍生物。这使得可以将数组传递给函数而无需将它们模板化(通过接口(interface))。它的实现方式有点可疑所以我想问一下下面的代码在C++中是否合法?该示例显示了使用 union 成员的方式,我尝试制作最小的示例,因此此处不存在接口(interface)和其他内容。主要问题是 union 成员以这种方式使用。我这样做的原因是可以创建没有默认 c-tor 的类型数组(不幸的是,这个例子也没有显示这一点)。

template<typename T, size_t N>
class Array
{
public:

Array() :
m_data( m_originalObjects ),
m_len(N),
m_place()
{
for( decltype(N) i = 0; i < N; i++ )
{
new( &m_data[i] )T();
}
}
//c-tor to objects without default c-tor
template<typename ... TCon>
Array( TCon && ... values ) :
m_data( m_originalObjects ),
m_len(N),
m_originalObjects{ static_cast<T>(values)... }
{
}

private:

T * m_data = nullptr;
size_t m_len = 0;

union
{
char m_place[sizeof(T) * N];
T m_originalObjects[N];
};
};

最佳答案

问题已解决,我希望将没有默认 c-tor 的 c 样式类型数组作为类成员编译失败,因此我使用 union 来“修复”这个问题。事实是没有这样的问题,感谢@sebrockm 让我大开眼界。下面的代码才是我真正需要的


template<typename T, size_t N>
class Array
{
public:

Array() :
m_data( m_originalObjects ),
m_len(N),
m_originalObjects{}
{
}

//конструктор с параметрами
template<typename ... TCon>
Array( TCon && ... values ) :
m_data( m_originalObjects ),
m_len(N),
m_originalObjects{ static_cast<T>(values)... }
{
}

private:

T * m_data = nullptr;
size_t m_len = 0;

T m_originalObjects[N];
};

关于c++ - 在 C++ 中构造数组元素在循环中调用 new 而不是 new[] 是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58623200/

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