繁体   English   中英

是否对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::reference_wrapper大小的任何线索,我想知道它是否已实现定义或有任何保证。


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

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

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

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

标准中无法保证。

没有明智的实现会使用多个指针。

static_assert它适合你,你有足够的对齐,所以你的代码是正确的(人们可以看到它是正确的)。 那个静态断言不会被击中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM