std::reference_wrapper的大小有什么保证吗?

Is there any guarantee on the size of an std::reference_wrapper?

考虑我有足够的存储空间来托管 void * 并因此就地构建指针的情况。
是否可以保证相同的存储空间足够大以始终存储 std::reference_wrapper

有点(出于我的想法,只是为了理解我的意思):

std::aligned_storage_t<sizeof(void *), alignof(void *)> storage;
// ...
int value = 0;
new (&storage) std::reference_wrapper<int>{value};

通过快速而粗略的测试,我发现在我的机器上这是有效的,即 std::reference_wrapper 的大小与 void * 的大小相符。但是,在不同的平台上可能会出现这种情况。同时,我在标准中找不到关于 和 std::reference_wrapper 大小的任何线索,我想知道它是否已定义实现或是否有任何保证。


为了提供上下文,我正在围绕不同类型(类似于 std::any)开发一个不透明的包装器,它执行小对象优化以尽可能避免分配。
当我收到 std::reference_wrapper 时,我想使用不同于用来区分 sizeof(T) > sizeof(void *) 与其他情况的路径。但是,我不知道我是否可以就地复制构造包装器,或者在这种情况下我是否也应该依赖分配。

C++ 标准没有提出任何大小要求。每 [refwrap]

  1. reference_­wrapper<T> is a Cpp17CopyConstructible and Cpp17CopyAssignable wrapper around a reference to an object or function of type T.
  2. reference_­wrapper<T> is a trivially copyable type.

我们所知道的是,它是可复制的,而且是微不足道的。除此之外,它留给了实施。通常,它只是 T* 的包装器,但由于某种原因,实现中可能还有一些其他成员

标准中没有保证。

没有任何明智的实现会使用超过一个指针。

static_assert 它适合并且您有足够的对齐方式,因此您的代码是正确的(人们可以看到它是正确的)。静态断言永远不会被击中。