【问题标题】:Is there an easy way default construct a generic type in C++, without an allocator instance?有没有一种简单的方法在 C++ 中默认构造一个泛型类型,没有分配器实例?
【发布时间】:2015-10-15 21:33:59
【问题描述】:

上下文是: 将包含类型 T 和 char * p 的容器写入内存区域。让我们假设指针已经针对类型 T 进行了适当的对齐 - 对齐问题不是问题的一部分。 我如何默认在该内存区域上构造一个元素?

((*T)(p))->T();

适用于类,但不适用于某些内置类型。

((*T)(p)) = 0; // or simply memset

对于整数类型,指针。 这两个是否涵盖了所有内容,工会等等? 对此是否有最佳实践或某些标准库功能? std::allocator::construct 可以做到,例如std::vector 使用,但它不是静态方法,所以我需要它的一个实例。是否有一些独立或静态的功能可以做到这一点?

--编辑--

是的,答案很明显,我今天很笨——新位置 顺便说一句,现在我正在尝试销毁元素...

【问题讨论】:

  • 新展示位置:new (p) T();
  • 第一个 sn-p 不应该编译...
  • 关于编辑:没有 delete 相当于新的放置。对于类,纯粹的破坏是通过显式的析构函数调用myFooPtr->~Foo(); 完成的。不幸的是,这似乎不适用于内置类型,所以我想,你在那一点上不走运。但是,由于您似乎不害怕繁重的模板,因此您可以使用 SFINAE 来区分可以或不能调用析构函数的情况,并相应地实例化带有/不带有此类析构函数调用的代码(内置类型不需要销毁)。不过要小心数组类型!

标签: c++ c++11 containers c++14


【解决方案1】:

“新展示位置”是要查找的术语。它是一个标准库operator new 重载,实际上并不分配内存,而只是返回您传递给它的任何指针。

【讨论】:

  • 这非常类似于评论。事实上,它与已经存在的评论非常相似。
  • @sehe 查看时间戳。发布该评论时,我显然已经在输入我的答案了。
  • 现在我正在尝试销毁该项目...回到原点
  • 您可以为此显式调用析构函数。
  • @BuellaGabor 查找“伪析构函数调用”。我猜您使用简单的 typedef 进行了测试。在这种情况下,您已经提前知道您不需要调用析构函数。一般情况下,如果事先不知道T,即使是简单类型,语法也会被接受。
【解决方案2】:

包含<new> 标头并使用其放置新分配功能,如下所示:

::new (p) T()

:: 限定避免了使用特定于类的分配函数。

括号(p) 是分配函数的参数列表。

这个分配函数只是返回传入的指针。

要学究起来,您还将指针指向void*,以避免在全局命名空间中找到一些假设的其他operator new。


问题中显示的代码((*T)(p))->T(); 不应编译。该标准明确指出构造函数没有名称。所以不能像普通函数一样调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2010-09-28
    相关资源
    最近更新 更多