考虑这样一种情况,我有足够的存储空间来托管 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]
reference_wrapper<T>
is a Cpp17CopyConstructible and Cpp17CopyAssignable wrapper around a reference to an object or function of typeT
.reference_wrapper<T>
is a trivially copyable type.
我们所知道的是它是可复制的,而且是微不足道的。除此之外,它留给了实现。通常它只是 T*
的包装器, 但由于某种原因,实现中可能还有一些其他成员
关于c++ - std::reference_wrapper 的大小有任何保证吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57165377/