C++ 新的+;重新解释
下面的代码可以编译,但我不能100%确定它是否符合标准:C++ 新的+;重新解释,c++,c++17,C++,C++17,下面的代码可以编译,但我不能100%确定它是否符合标准: #include <memory> class A { public: int x; }; int main() { uint8_t m_storage[sizeof(A)]; new (m_storage) A(); auto deleter = [](A * p) { p->~A(); }; std::unique_ptr<A, decl
#include <memory>
class A
{
public:
int x;
};
int main()
{
uint8_t m_storage[sizeof(A)];
new (m_storage) A();
auto deleter = [](A * p) { p->~A(); };
std::unique_ptr<A, decltype(deleter)> p(reinterpret_cast<A *>(m_storage), deleter);
p->x = 0;
return p->x;
}
#包括
甲级
{
公众:
int x;
};
int main()
{
uint8_t m_存储[sizeof(A)];
新(m_存储器)A();
自动删除器=[](A*p){p->~A();};
std::唯一的ptr p(重新解释转换(存储),删除器);
p->x=0;
返回p->x;
}
这是正确使用的重新解释投射吗?是的,这是正确的重新解释投射
尽管没有正确对齐存储。以及可能错误的新位置(应将参数强制转换为
void*
)。如果可以,最好捕获新位置表达式生成的指针。这将需要更少的律师。相关:@IlCapitano你是说std::launder
?看起来它可以alignas(A)uint8_t m_存储[sizeof(A)]代码>最好改用,例如:std::aligned_storage\u t m_storage代码>或者,如果需要A
s的数组:std::aligned_storage\u t m_storage[N]代码>