放置新的错误警告?

False warning for placement new?

我有以下代码:

#include "type_traits"
#include <new>


void foo()
{
    std::aligned_storage<10,alignof(long)> storage;
    new (&storage) int(12);
}

我定义了一些存储空间(长度为 10 字节),我正在将 newing 一个 int 放置到该位置

gcc 7.3 给出以下警告:

<source>:10:10: warning: placement new constructing an object of type 'int' and size '4' in a region of type 'std::aligned_storage<10, 8>' and size '1' [-Wplacement-new=]
     new (&storage) int(12);

如果我没记错的话,这个警告是不正确的。我是不是遗漏了什么或者这个警告是虚假的?

std::aligned_storage 是具有嵌套 type 成员的特征。 type 的大小和对齐方式正确。特征本身可能没有数据成员,因此将获得默认对象大小,即 1。

所以修复很简单:

std::aligned_storage<10,alignof(long)>::type storage;