c++ - std::reference_wrapper 的大小有任何保证吗?

标签 c++ language-lawyer c++17 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* 的包装器, 但由于某种原因,实现中可能还有一些其他成员

关于c++ - std::reference_wrapper 的大小有任何保证吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57165377/

相关文章:

c++ - C++ 中的“自动”声明问题

c++ - 我应该用/MD 还是/MT 编译?

c++ - 编译器可以通过指向 volatile 的指针优化存储吗?

c++ - 这个 `main` 的定义有多合法?

c++ - 使用模板调用运算符和通用 lambda 重载结构 - gcc vs clang

c++ - string 和 string_view 的索引运算符([])的区别

c++ - 如何在没有动态内存分配的情况下创建对象数组

c++ - Pthread 将函数传递给池

c++ - 通过 bool 进行的 char 往返转换会发生什么情况?

c++ - 如何限制 C++17 模板参数中的 lambda 签名?