sky*_*ack 7 c++ language-lawyer reference-wrapper c++17
考虑以下情况:我有足够的存储空间来托管a void *并因此就地构造一个指针。
是否可以保证相同的存储空间足够大,以便始终存储一个std::reference_wrapper?
某种(出于我的想法而写,只是为了理解我的意思):
std::aligned_storage_t<sizeof(void *), alignof(void *)> storage;
// ...
int value = 0;
new (&storage) std::reference_wrapper<int>{value};
Run Code Online (Sandbox Code Playgroud)
通过快速而肮脏的测试,我发现在我的机器上这是有效的,即与的大小std::reference_wrapper相符void *。但是,在不同平台上可能是这种情况。同时,我在标准中找不到关于和的大小的任何线索,std::reference_wrapper而且我想知道它的实现是否已定义或是否有任何保证。
为了提供上下文,我正在围绕不同类型(类似于std::any)的不透明包装器进行包装,该包装器执行小型对象优化以避免可能的分配。
收到时std::reference_wrapper,我想使用与用于区别sizeof(T) > sizeof(void *)其他情况的路径不同的路径。但是,我不知道我是否可以就地复制包装器的构造,或者在这种情况下是否还应该依靠分配。
标准中没有保证。
没有明智的实现将使用更多的指针。
static_assert它适合并且您具有足够的对齐方式,因此您的代码是正确的(人们可以看到它是正确的)。该静态断言将永远不会被击中。