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::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 type T
.
reference_wrapper<T>
is a trivially copyable type.
我们所知道的是,它是可复制的,而且是微不足道的。除此之外,它留给了实施。通常,它只是 T*
的包装器,但由于某种原因,实现中可能还有一些其他成员
标准中没有保证。
没有任何明智的实现会使用超过一个指针。
static_assert
它适合并且您有足够的对齐方式,因此您的代码是正确的(人们可以看到它是正确的)。静态断言永远不会被击中。
考虑我有足够的存储空间来托管 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*
的包装器,但由于某种原因,实现中可能还有一些其他成员
标准中没有保证。
没有任何明智的实现会使用超过一个指针。
static_assert
它适合并且您有足够的对齐方式,因此您的代码是正确的(人们可以看到它是正确的)。静态断言永远不会被击中。