[英]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]
reference_wrapper<T>
是围绕对类型T
的对象或函数的引用的Cpp17CopyConstructible和Cpp17CopyAssignable包装器。reference_wrapper<T>
是一种简单的可复制类型。
我们所知道的只是可复制的,而且是微不足道的。 除此之外,还留给实施。 通常它只是T*
的包装器,但由于某种原因,实现中可能还有其他成员
标准中无法保证。
没有明智的实现会使用多个指针。
static_assert
它适合你,你有足够的对齐,所以你的代码是正确的(人们可以看到它是正确的)。 那个静态断言不会被击中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.