8

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

有点(写在我的脑海里,只是为了理解我的意思):

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

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


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

4

2 回答 2

7

C++ 标准没有任何大小要求。每[重新包装]

  1. reference_­wrapper<T>是 Cpp17CopyConstructible 和 Cpp17CopyAssignable 包装器,围绕对类型的对象或函数的引用T
  2. reference_­wrapper<T>是一种可简单复制的类型。

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

于 2019-07-23T13:44:40.413 回答
6

标准中没有保证。

没有任何明智的实现会使用比指针更多的东西。

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

于 2019-07-23T14:23:06.450 回答